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

str*_*ugi 6 c++ static multithreading

void foo() {
    static int id = 0;
    const int local_id = id++;
    //do something with local_id;
}
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 7

您的代码不是线程安全的,因为多个线程可以id同时读取,并产生相同的值local_id.

如果你想要一个线程安全的版本,请使用std::atomic_intC++ 11中提供的版本:

void foo() {
    static std::atomic_int id;
    const int local_id = id++;
    //do something with local_id;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您使用的是Microsoft编译器,那么`id`的初始化将不是线程安全的,因为它们还不支持"魔法静态"(从VS2013开始).换句话说,如果从未调用`foo`然后两个线程同时调用它,`id`的构造函数可以并行运行两次,结果不可预测. (3认同)