是否需要使用互斥锁来锁定thread_local变量?

时间:2015-08-08 10:00:56

标签: c++ multithreading

我将soap-address个变量视为每个线程的私有变量,只是名称相同。但是我发现的所有示例都使用thread_local变量来锁定mutex变量。这困惑了我。如果thread_local对每个线程都是私有的,那么就没有必要处理并发问题,或者我对“私有”想法的确认是错误的?

取自here

的示例
thread_local

在这种情况下,是否需要锁定#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(); } 变量?

2 个答案:

答案 0 :(得分:3)

如果你指向一个thread_local对象,并将指针传递给另一个线程,在某种程度上,另一个线程仍然可以使用指针访问原始线程的thread_local对象(直到原始线程终止,之后这一点因为未定义的行为)。

因此,如果在您的应用程序中发生这种情况,您仍需要安排互斥保护或类似的东西,以便以线程安全的方式访问thread_local对象。

答案 1 :(得分:0)

命名thread_local变量私有变量有点不幸。

thread_local声明的变量由其thread拥有,其他thread无法访问,除非所有者thread(由于某种原因)为他们指定了该变量变量。 thread_local变量在其线程的所有函数之间共享;即它有它的寿命。如果构造了thread_local变量,它将在thread退出时被销毁。

thread_local变量可以是静态的,在这种情况下应该注意确保程序按预期执行。我不会讨论这个问题,因为它不是问题的一部分。

如示例中所指出的,示例中的mutex不适用于数据竞争条件。它是同步控制台输出:mutex被称为cout_mutex - 自我解释。