2017-03-09 157 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。