据我所知,C ++对线程一无所知(我猜之前是C ++ 11标准)。
所以说我有以下伪代码:
int i = 0;
function foo()
{
i++;
cout << i << endl;
}
int main()
{
CreateThread(...,foo,...);
foo();
Sleep(10000);
return 0;
}
由于C ++编译器对线程一无所知,因此只能看到一个线程正在修改i
,因此编译器只能将i
的值存储在寄存器中。现在程序运行时,两个线程中的每一个都有一个代表i
的寄存器,其值为0
,每个线程都会将自己的寄存器递增到1
!
我的假设是否正确?有没有办法告诉C ++编译器不优化全局变量(我使用的是Visual C ++ 2010)。
答案 0 :(得分:3)
您正在做的是未定义的行为。
就像银行交易一样,不允许同时访问变量。
选择一个:
std::atomic
(C ++ 11)或编译器特定的内在函数。
std::mutex
(C ++ 11)或其Windows等同。