揮発性のメモ2

知識をメモ書きしておく

アトミックなメモリアクセスのための組込み関数 2

https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/_005f_005fatomic-Builtins.html
jessieのコンパイラがgcc4.7.2だったのでやってみた


アトミックなメモリアクセスのための組込み関数 - 揮発性のメモ

#include <pthread.h>
#include <stdio.h>

volatile long long A=0;

void *gettidtest( void *arg )
{
    int number = (int)(long) arg;
    long long i;

    printf("thread=%d start\n", number);
    for(i=0;i<10000000LL;i++){
//      A++;     // 排他制御なし
//      __sync_add_and_fetch( &A, 1 );   // gcc4.1のアトミック関数
        __atomic_add_fetch( &A, 1, __ATOMIC_RELAXED );   // gcc4.7のアトミック関数
    }
    printf("thread=%d end\n", number);

    return NULL;
}

int main( int argc, char **argv )
{
    int i;
    pthread_t p[10]={};

    for(i=0;i<10;i++){
        pthread_create( &p[i], NULL, gettidtest, (void*)(long)i );
    }
    for(i=0;i<10;i++){
        pthread_join( p[i], NULL );
    }
    printf("A=%lld\n",A);

    return 0;
}

1億円を10人で手分けして数えるプログラム。単純にA++でやると、2000万円くらいになってしまう。


Atomic/GCCMM/AtomicSync - GCC Wiki
排他制御をどういう考えでやるかはここに書いてあるらしい。
一番しょぼそうな__ATOMIC_RELAXEDでも普通に排他してるが、ここに本来何を書くべきなのかはよくわかってない。