我認爲thread_local
變量是每個線程的私有變量,只是名稱相同。但是,我發現所有示例都使用mutex
變量在訪問變量時鎖定thread_local
變量。這讓我困惑。如果thread_local
對於每個線程都是私有的,那麼就不需要考慮併發問題,或者我對「私有」想法的承認是錯誤的?thread_local變量是否需要使用互斥鎖定?
實施例從here採取:
#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();
}
在這種情況下,是否需要鎖定thread_local
變量?
哪個例子?如果你顯示它,我們可能會告訴你它爲什麼使用互斥鎖,但可能有不同的原因。 –
@RaphaelMiedl我得到了一個:http://stackoverflow.com/a/15698197/2269707 – reavenisadesk
'互斥'只有通過'std :: cout'同步輸出('std :: cout'不是線程安全並可以交織輸出),正如名稱所暗示的,它與thread_local變量無關。你可以通過輸出看到thread_local變量是完全不同的。 –