据我所知,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)。
最佳答案
你正在做的是未定义的行为。
就像银行交易一样,不允许同时访问一个变量。
选择一个:
std::atomic
(C++11) 或编译器特定的内部函数。std::mutex
(C++11) 或其等效的 Windows。
关于c++ - 是否有什么阻止 C++ 优化全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42687942/