0

我在 Winx 中的 MinGW 中有以下测试,由以下人员编译:

g++ -std=c++11 -DTEST2 testatomic1.cpp -lpthread -o testatomic1.exe

g++ -std=c++11 -DTEST4 testatomic1.cpp -lpthread -o testatomic1.exe

atomic_int  totalx(0);

void *test_func0(void *arg)
{
    #ifdef TEST2
    for(i=0;i<100000000;++i){
        totalx += 1 ;  
    }//for  
    #endif
    #ifdef TEST4
    for(i=0;i<100000000;++i){
        atomic_fetch_add(&totalx, 1); 
    }//for  
    #endif 
}

int main(int argc, const char *argv[])
{
    pthread_t id[3];
    int iCPU =1  ;
    pthread_create(&id[0],NULL,test_func0,(void *)(long)iCPU );
    pthread_create(&id[1],NULL,test_func0,(void *)(long)iCPU );
    pthread_create(&id[2],NULL,test_func0,(void *)(long)iCPU );

    int i ;
    for(i=0;i<3;++i){
        pthread_join(id[i],NULL);
    }
    #ifdef TEST2
    cout << "TEST2 totalx=" << totalx << endl  ;
    #endif
    #ifdef TEST4 
    cout << "TEST4 totalx=" << totalx << endl  ;
    #endif
}//main 

这个测试在 TEST2 和 TEST4 定义中运行了很多次,答案都是 300000000,在 TEST4 中,它按我的预期工作,TEST2 对我来说很奇怪,totalx += 1;没有任何记忆模型,就可以产生正确的答案……那为什么还要有加载、存储功能呢?只需定义一个 atomic_int var 就可以完成这项工作,我想这太容易了……我错过了什么吗?

4

1 回答 1

1

C++11 标准定义atomic_XXXtypedef( std::atomic<XXX>[atomics.types.generic] p7)。std::atomic<int>具有被定义为与([atomics.types.operations.pointer] p27)operator+=(int)具有相同效果的一个。atomic_fetch_add因此,您的两个测试序列被定义为具有相同的效果。

这些atomic_XXX类型是为了 C11 兼容性 - 您可能会更轻松地使用std::atomic<XXX>.

于 2013-06-26T06:31:57.547 回答