C++ 线程_局部变量是否需要使用互斥锁锁定?
我认为C++ 线程_局部变量是否需要使用互斥锁锁定?,c++,multithreading,C++,Multithreading,我认为thread\u local变量是每个线程的私有变量,只是名称相同。但我发现的所有示例都使用互斥体变量在访问线程时锁定本地变量。这让我很困惑。如果thread\u local对于每个线程都是私有的,那么就没有必要考虑并发问题,或者我对“私有”概念的确认是错误的 示例取自: #包括 #包括 #包括 #包括 线程\本地无符号整数范围=1; std::mutex cout_mutex; 无效增加范围(常量标准::字符串和线程名称) { ++愤怒; std::锁和保护锁(cout\u互斥); st
thread\u local
变量是每个线程的私有变量,只是名称相同。但我发现的所有示例都使用互斥体
变量在访问线程时锁定本地
变量。这让我很困惑。如果thread\u local
对于每个线程都是私有的,那么就没有必要考虑并发问题,或者我对“私有”概念的确认是错误的
示例取自:
#包括
#包括
#包括
#包括
线程\本地无符号整数范围=1;
std::mutex cout_mutex;
无效增加范围(常量标准::字符串和线程名称)
{
++愤怒;
std::锁和保护锁(cout\u互斥);
std::cout如果您获取指向一个线程本地对象的指针,并将指针传递给另一个线程,那么另一个线程仍可以通过某种方式使用该指针访问原始线程的线程本地对象(直到原始线程终止,在此之后这将成为未定义的行为)
因此,如果在应用程序中发生这种情况,您仍然需要安排互斥保护或类似的保护,以便以线程安全的方式访问thread\u local对象。如果您将指针指向thread\u local对象,并将指针传递给另一个线程,那么另一个线程仍可以以某种方式访问原始线程使用指针读取的thread_本地对象(直到原始线程终止,在此之后这将成为未定义的行为)
因此,如果在应用程序中发生这种情况,您仍然需要安排互斥保护或类似的保护,以便以线程安全的方式访问thread\u local对象。如果您将指针指向thread\u local对象,并将指针传递给另一个线程,那么另一个线程仍可以以某种方式访问原始线程使用指针读取的thread_本地对象(直到原始线程终止,在此之后这将成为未定义的行为)
因此,如果在应用程序中发生这种情况,您仍然需要安排互斥保护或类似的保护,以便以线程安全的方式访问thread\u local对象。如果您将指针指向thread\u local对象,并将指针传递给另一个线程,那么另一个线程仍可以以某种方式访问原始线程使用指针读取的thread_本地对象(直到原始线程终止,在此之后这将成为未定义的行为)
因此,如果在应用程序中发生这种情况,您仍然需要安排互斥保护或类似的保护,以便以线程安全的方式访问thread_local对象。命名thread_local
变量私有变量有点不幸
thread\u local
声明的变量由其thread
所有,其他线程
无法访问该变量,除非所有者thread
(出于某种原因)向其提供指向该变量的指针。
thread\u local
变量在其线程的所有函数之间共享,即它有其生存期。如果构造了thread\u local
变量,则当其线程退出时,该变量将被销毁
thread\u local
变量可以是静态的,在这种情况下,应该注意确保程序按预期执行。我不打算讨论这个问题,因为这不是问题的一部分
您的示例中的mutex
,正如注释中所指出的,不是用于数据竞争条件。它是为了同步控制台输出:mutex
被称为cout\u mutex
-自我解释。命名thread\u local
变量私有变量有点不幸
thread\u local
声明的变量由其thread
所有,其他线程
无法访问该变量,除非所有者thread
(出于某种原因)向其提供指向该变量的指针。
thread\u local
变量在其线程的所有函数之间共享,即它有其生存期。如果构造了thread\u local
变量,则当其线程退出时,该变量将被销毁
thread\u local
变量可以是静态的,在这种情况下,应该注意确保程序按预期执行。我不打算讨论这个问题,因为这不是问题的一部分
您的示例中的mutex
,正如注释中所指出的,不是用于数据竞争条件。它是为了同步控制台输出:mutex
被称为cout\u mutex
-自我解释。命名thread\u local
变量私有变量有点不幸
thread\u local
声明的变量由其thread
所有,其他线程
无法访问该变量,除非所有者thread
(出于某种原因)向其提供指向该变量的指针。
thread\u local
变量在其线程的所有函数之间共享,即它有其生存期。如果构造了thread\u local
变量,则当其线程退出时,该变量将被销毁
thread\u local
变量可以是静态的,在这种情况下,应该注意确保程序按预期执行。我不打算讨论这个问题,因为这不是问题的一部分
您的示例中的mutex
,正如注释中所指出的,不是用于数据竞争条件。它是为了同步控制台输出:mutex
被称为cout\u mutex
-自我解释。命名thread\u local
变量私有变量有点不幸
thread\u local
声明的变量由其thread
所有,其他线程
无法访问该变量,除非所有者thread
(出于某种原因)向其提供指向该变量的指针。
thread\u local
变量为sh
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
thread_local unsigned int rage = 1;
std::mutex cout_mutex;
void increase_rage(const std::string& thread_name)
{
++rage;
std::lock_guard<std::mutex> lock(cout_mutex);
std::cout << "Rage counter for " << thread_name << ": " << rage << '\n';
}
int main()
{
std::thread a(increase_rage, "a"), b(increase_rage, "b");
increase_rage("main");
a.join();
b.join();
}