2017-03-09 160 views
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)。

+0

只需在C++ 11編譯器中進行編譯... –

+1

您必須使用同步來保護從多個線程對'i'的訪問。 C++ 11將此功能添加到語言中;在C++ 11之前,您必須使用操作系統功能,例如關鍵部分 –

+0

@MM但編譯器並不知道關鍵部分的任何內容(就編譯器而言,「EnterCriticalSection()」和「LeaveCriticalSection() '只是常規函數),所以到C++代碼被編譯成機器代碼時,全局變量就不存在了,臨界區內的指令只能在寄存器中工作。 – Christopher

回答

3

你在做什麼是未定義的行爲

就像銀行交易一樣,不允許同時訪問變量。

選擇其中之一:

  1. std::atomic(C++ 11)或編譯器特定的內在。

  2. std::mutex(C++ 11)或它的Windows equavilent。