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(!)の案件もまだまだあるので、このあたりは使い分けが必要で面倒くさい。