2015-08-08 94 views
1

我認爲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變量?

+2

哪個例子?如果你顯示它,我們可能會告訴你它爲什麼使用互斥鎖,但可能有不同的原因。 –

+0

@RaphaelMiedl我得到了一個:http://stackoverflow.com/a/15698197/2269707 – reavenisadesk

+2

'互斥'只有通過'std :: cout'同步輸出('std :: cout'不是線程安全並可以交織輸出),正如名稱所暗示的,它與thread_local變量無關。你可以通過輸出看到thread_local變量是完全不同的。 –

回答

2

如果將指針指向thread_local對象,並以某種方式將指針傳遞給另一個線程,則其他線程仍然可以使用該指針訪問原始線程的thread_local對象(直到原始線程終止,在該點之後這變成了未定義的行爲)。

因此,如果這可能發生在您的應用程序中,您仍然需要安排互斥鎖保護或其他相當的東西,以便以線程安全的方式訪問thread_local對象。

0

命名爲thread_local變量的私有變量有點不幸。

一個thread_local聲明的變量是由它的thread和無法訪問的,除非車主thread(出於某種原因)給了他們一個指針變量所擁有的其他thread秒。 A thread_local變量在其線程的所有函數中共享;即它有其生命週期。如果構建了一個thread_local變量,它將在其thread退出時被銷燬。

A thread_local變量可以是靜態的,在這種情況下應該注意確保程序按預期執行。我不會深究這一點,因爲它不是問題的一部分。

您的示例中的mutex(如註釋中所指出的)不適用於數據競爭條件。它是同步控制檯輸出:mutex被稱爲cout_mutex - 自我解釋。

相關問題