0

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 関数と関係がありますか?

4

1 に答える 1