2015-08-08 69 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 - 自我解释。

相关问题