3

FIFOを介して通信する2つのプログラム(クライアント/サーバー)を構築しています。どちらのプログラムにもスレッドがあります。クライアントのスレッドが終了すると、スレッドは結合されず、メインがハングします。

プログラムは次のことを行います。

サーバ:

  1. main:FIFO1から読み取ります
  2. main:リクエストを処理するスレッドを作成します。
  3. メイン:goto 1
  4. スレッド:リクエストを処理します
  5. スレッド:FIFO2に応答を送信します
  6. スレッド:終了

クライアント:

  1. メイン:スポーンスレッド
  2. スレッド:FIFO2からクライアントへのX応答を読み取ります
  3. スレッド:終了
  4. main:XリクエストをFIFO1に送信します
  5. main:スレッドが終了するのを待つ
  6. メイン:応答を確認する

サーバーは正常に動作し、それに応じてすべてのスレッドが結合されます。

クライアントはステップ5で失敗します。

pthread_join(&reader,NULL);

メインが永遠にぶら下がっています。確認しましたが、スレッドはすでに終了しています。

使用する

pthread_tryjoin_np(&reader,NULL);

私は得る

エラーコード=16

strerrorは与える

デバイスまたはリソースがビジー

スレッドの作成:

pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
pthread_create(&reader,&attr,trataResp,NULL);

または、pthread_create(&reader、NULL、trataResp、NULL);を使用します。

変化はありません。

どうすればこれを解決できますか?

4

1 に答える 1

4

pthread_joinは、アドレスではなくスレッドIDを受け取ります。この行:

pthread_join(&reader,NULL);

する必要があります:

pthread_join(reader,NULL);

readerとして宣言された場合pthread_t

それがあなたの質問の単なるタイプミスではなく、これが実際に役立つことを願っています。

于 2012-05-23T12:39:42.627 に答える