簡體   English   中英

是否需要使用互斥鎖鎖定thread_local變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM