揮発性のメモ2

http://d.hatena.ne.jp/iww/

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

http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html
排他制御をきっちりやってても、頭の中ではなんとなく「インクリメントくらい何もしなくてもアトミックだろ」と思ってたけど、実際にやったら全然ダメだった。

#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 );
    }
    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万円くらいになってしまう。


調べてたら gcc-4.7 ではすでにレガシー扱いだった。 早いよ
http://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/_005f_005fsync-Builtins.html

gcc-3.3(!)の案件もまだまだあるので、このあたりは使い分けが必要で面倒くさい。