[英]Do thread_local variables need to be locked using a mutex?
我將thread_local
變量視為每個線程的私有變量,只是名稱相同。 但是我發現的所有示例在訪問它時都使用mutex
變量來鎖定thread_local
變量。 這讓我感到困惑。 如果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();
}
在這種情況下,是否有必要鎖定thread_local
變量?
如果您使用一個指向thread_local對象的指針,並將該指針傳遞給另一個線程,則在某種程度上,另一個線程仍然可以使用該指針訪問原始線程的thread_local對象(直到發起線程終止,此后這變成未定義的行為) )。
因此,如果這可能在您的應用程序中發生,則您仍將需要安排互斥保護或等效保護,以便以線程安全的方式訪問thread_local對象。
命名thread_local
變量私有變量有點不幸。
聲明的thread_local
變量由其thread
擁有,並且其他thread
無法訪問,除非所有者thread
(由於某種原因)為它們提供了指向該變量的指針。 thread_local
變量在其線程的所有功能之間共享; 即它有它的壽命。 如果構造了thread_local
變量,則在其thread
退出時將銷毀它。
thread_local
變量可以是靜態的,在這種情況下,應注意確保程序按預期執行。 我將不討論這個問題,因為這不是問題的一部分。
如注釋中所指出,示例中的mutex
不適用於數據爭用條件。 這是為了同步控制台輸出: mutex
稱為cout_mutex
自解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.