我将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();
}
变量?
答案 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
- 自我解释。