C++ 静态局部变量的线程安全增量

C++ 静态局部变量的线程安全增量,c++,multithreading,static,C++,Multithreading,Static,多个线程可以多次并行调用foo。我希望foo的每次调用都使用local_id的“unique”值。上面的代码可以吗?我想知道在第一个线程增加id值之前,第二个线程是否会将id值分配给local_id。如果不安全,有没有标准的解决方案?您的代码不是线程安全的,因为多个线程可以同时读取id,并生成相同的local\u id值 如果需要线程安全版本,请使用C++11中提供的std::atomic_int: void foo() { static int id = 0; const in

多个线程可以多次并行调用foo。我希望foo的每次调用都使用local_id的“unique”值。上面的代码可以吗?我想知道在第一个线程增加id值之前,第二个线程是否会将id值分配给local_id。如果不安全,有没有标准的解决方案?

您的代码不是线程安全的,因为多个线程可以同时读取
id
,并生成相同的
local\u id

如果需要线程安全版本,请使用C++11中提供的
std::atomic_int

void foo() {
    static int id = 0;
    const int local_id = id++;
    //do something with local_id;
}

您的代码不是线程安全的,因为两个线程可能同时增加id


使用或std::atomic作为共享id变量。

使用注意,id的初始化可能是线程安全的,也可能不是线程安全的,这取决于编译器是否支持“magic statics”。@dlf对,但值得一提的是,“magic statics”是C++11所必需的,因此这是编译器一致性的问题,不支持可选功能。@Agnew,true,但问题不需要C++11:)。现在编辑已经太晚了,但我会修改它,说“你是否有一个支持神奇静态的C++11编译器”。这真的是C++11吗?在我看来,它更像是C。在上述情况下如何使用互斥?请您进一步详细说明一下好吗?将static封装在一个类中,并提供在执行操作之前获取互斥体的get/increment方法。请注意,如果您使用的是Microsoft编译器,
id
的初始化将不会是线程安全的,因为它们还不支持“magic statics”(从VS2013开始)。换句话说,如果从未调用过
foo
,然后两个线程同时调用它,
id
的构造函数可能会并行运行两次,并产生不可预测的结果。
void foo() {
    static std::atomic_int id;
    const int local_id = id++;
    //do something with local_id;
}