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