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でも普通に排他してるが、ここに本来何を書くべきなのかはよくわかってない。