关于g ++ 4.8.1编译器中atomic_int的测试

时间:2013-06-26 06:09:00

标签: c++ c++11 atomic

我在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定义中运行多次,答案全部为3亿,  在TEST4中,它按预期工作,TEST2对我来说很奇怪,totalx + = 1; 没有任何记忆模型,可以产生正确的答案...然后为什么麻烦 加载,存储功能?只需定义一个atomic_int var即可完成工作, 我不知道这太容易了......我想念一下吗?

1 个答案:

答案 0 :(得分:1)

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

atomic_fetch_add类型适用于C11兼容性 - 您可以更轻松地使用atomic_XXX