0
据我所知,C++对线程一无所知(在我猜测C++ 11标准之前)。有没有什么能够阻止C++优化全局变量?
所以说,我有以下的伪代码:
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)。
只需在C++ 11编译器中进行编译... –
您必须使用同步来保护从多个线程对'i'的访问。 C++ 11将此功能添加到语言中;在C++ 11之前,您必须使用操作系统功能,例如关键部分 –
@MM但编译器并不知道关键部分的任何内容(就编译器而言,“EnterCriticalSection()”和“LeaveCriticalSection() '只是常规函数),所以到C++代码被编译成机器代码时,全局变量就不存在了,临界区内的指令只能在寄存器中工作。 – Christopher