void foo() {
static int id = 0;
const int local_id = id++;
//do something with local_id;
}
多个线程可以并行多次调用foo函数。我希望每次调用foo时都使用“唯一”的local_id值。以上代码是否可行?我想知道第二个线程在第一个线程增加值之前是否将id的值分配给了local_id。如果不安全,是否有标准解决方案?
void foo() {
static int id = 0;
const int local_id = id++;
//do something with local_id;
}
多个线程可以并行多次调用foo函数。我希望每次调用foo时都使用“唯一”的local_id值。以上代码是否可行?我想知道第二个线程在第一个线程增加值之前是否将id的值分配给了local_id。如果不安全,是否有标准解决方案?
你的代码不是线程安全的,因为多个线程可以同时读取id
,并生成相同值的local_id
。
如果你想要一个线程安全的版本,可以使用C++11中提供的std::atomic_int
:
void foo() {
static std::atomic_int id;
const int local_id = id++;
//do something with local_id;
}
id
的初始化将不是线程安全的,因为它们尚未支持“magic statics”(截至VS2013)。换句话说,如果foo
从未被调用,然后两个线程同时调用它,id
的构造函数可能会并行运行两次,并产生不可预测的结果。 - dlf
std::atomic_int
。 - Mgetz