Linuxカーネル2.6.18-194で実行されているacプログラムがあり、サーバーにはハイパースレッディングを備えた6コアの1つのCPUソケットがあり、スレッド1はデータを受信し、スレッド2とスレッド3はスレッド1が受信したデータを別のプロセスに渡します。スレッド2とスレッド3の両方が正常に終了した後データの受け渡しが終了すると、thread1 は再びデータを受け取ります!!
流れるのはthread1ソースです:
DoGetDataFromSocket() ;
iGlbBOOKReadDone = 0 ;
iGlbPOSIReadDone = 0 ;
sem_post(sembook) ;
sem_post(semposi) ;
sem_wait(semfinished) ;
以下は、thread2 と thread3 のソースです。
if(bThisThreadIsBook==1)
sem_wait(sembook) ;
else
sem_wait(semposi) ;
DoPassDatatoAnotherProcess() ;
if(bThisThreadIsBook==1)
{
__sync_add_and_fetch(&iGlbBOOKReadDone,1) ;
}
else
{
__sync_add_and_fetch(&iGlbPOSIReadDone,1) ;
}
Pthread_mutex_lock(&DoneMutex) ;
if( (iGlbBOOKReadDone == 1) && (iGlbPOSIReadDone == 1) )
sem_post(semfinished) ;
Pthread_mutex_unlock(&DoneMutex) ;
それは私にはうまくいきます、私はスレッド2とスレッド3でmutex_lock DoneMutexを削除しようとしますが、それでもうまくいきますまったく同時に、両方のスレッドが if( (iGlbBOOKReadDone == 1) && (iGlbPOSIReadDone == 1) ) を false にし、 sem_post(semfinished) が呼び出されることはありませんが、私は多くの圧力テストを行いますが、これは決してありません起こる!!__sync_add_and_fetch 関数と関係がありますか?