-1

pthreadを使用して送受信機能をシミュレートしようとしています。私は次のコードを実装しました。ただし、ハングしたり、間違った結果が生成される場合があります。

int g_sender,g_receiver; //global variables to keep track of the sender and receiver
void send(double ** data,int sender,int receiver, int size[],int block_size){
    int i;
    pthread_mutex_lock(&lock);  
    for (i=0;i<size[0];i++)
            memcpy(sharedA[i],data[i],size[1]*block_size);
    g_sender = sender;
    g_receiver = receiver;
    sem_wait(&sem);
    pthread_mutex_unlock(&lock);

}

void receive(double ** data, int sender,int receiver, int size[],int block_size){
        int i;
    while(!(sender==g_sender && receiver==g_receiver));
    for(i=0;i<size[0];i++)
        memcpy(data[i],sharedA[i],size[1]*block_size);
    g_sender =-1;
    g_receiver = -1;
    sem_post(&sem);
}

私がここで逃したことは何だと思いますか?

ありがとう

4

1 に答える 1

0

多くの :)

  • ロックを保持する目的は何ですか?
  • ロックを保持しているときにセマフォを待つことはありません
  • ライブラリ関数の戻り値を常に確認してください。特に sem_関数は割り込み可能であるため、割り込みが発生したかどうかを確認する必要がありますsem_wait
  • POSIXスレッドの経験があまりない場合は、を使用しないでください sem_t。代わりに、ミューテックスと条件変数を使用してください。これらは、アプリケーションコードにより適した高レベルのインターフェイスです。
于 2012-04-28T08:02:01.540 に答える