Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有什么东西可以阻止C++;从优化全局变量? 据我所知,C++对线程(C++ 11标准之前)一无所知。_C++_Winapi - Fatal编程技术网

有什么东西可以阻止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
    函数是一种比使用临界段更有效的原子递增变量的方法。