有什么东西可以阻止C++;从优化全局变量? 据我所知,C++对线程(C++ 11标准之前)一无所知。
假设我有以下伪代码:有什么东西可以阻止C++;从优化全局变量? 据我所知,C++对线程(C++ 11标准之前)一无所知。,c++,winapi,C++,Winapi,假设我有以下伪代码: int i = 0; function foo() { i++; cout << i << endl; } int main() { CreateThread(...,foo,...); foo(); Sleep(10000); return 0; } inti=0; 函数foo() { i++; cout你所做的是未定义的行为 与银行交易一样,不允许同时访问变量 选择一个: 原子的(C++1
int i = 0;
function foo()
{
i++;
cout << i << endl;
}
int main()
{
CreateThread(...,foo,...);
foo();
Sleep(10000);
return 0;
}
inti=0;
函数foo()
{
i++;
cout你所做的是未定义的行为
与银行交易一样,不允许同时访问变量
选择一个:
原子的(C++11)或编译器特定的内部函数
std::mutex
(C++11)或其Windows同等版本
您所做的是未定义的行为
与银行交易一样,不允许同时访问变量
选择一个:
原子的(C++11)或编译器特定的内部函数
std::mutex
(C++11)或其Windows同等版本
只需在C++11编译器中编译它……您必须使用同步来保护多个线程对i
的访问。C++11将此功能添加到语言中;在C++11之前,您必须使用操作系统功能,如CriticalSections@M.M但是编译器对关键部分一无所知(就编译器而言,EnterCriticalSection()
和LeaveCriticalSection()
只是常规函数)因此,当C++代码编译成机器代码时,全局变量就消失了,而关键部分的指令只在登记器上登记。@克里斯托弗,任何调用外部函数的方法都会阻止Visual Studio 2010优化全局变量的存在。如果是这样的话,寄存器中的值总是在外部调用之前写入内存,然后从内存中读取。顺便说一句,InterlockedIncrement
函数是一种比使用临界段更有效的原子递增变量的方法。只需在C++11编译器中编译它……您必须使用同步保护多线程对i
的访问。C++11将此功能添加到语言中;在C++11之前,您必须使用操作系统功能,如CriticalSections@M.M但是编译器对关键部分一无所知(就编译器而言,EnterCriticalSection()
和LeaveCriticalSection()
只是常规函数)因此,当C++代码编译成机器代码时,全局变量就消失了,而关键部分的指令只在登记器上登记。@克里斯托弗,任何调用外部函数的方法都会阻止Visual Studio 2010优化全局变量的存在。如果是这样,寄存器中的值总是在外部调用之前写入内存,然后从内存中读取。顺便说一句,InterlockedIncrement
函数是一种比使用临界段更有效的原子递增变量的方法。