2

私はこのようなセットアップを少し持っています:

void* work(void*) { while (true) {/*do work*/} return 0;}

class WorkDoer
{
private:
    pthread_t id;
public:
    WorkDoer() { pthread_create(&id, NULL, work, (void*)this); }
    void Shutdown() { pthread_join(id, NULL); /*other cleanup*/ }
}

Shutdown()メイン スレッドから呼び出される場合もあれば、スレッド自体から shutdown を呼び出したい場合もあります (そのスレッドからすぐに戻ります)。

のドキュメントには、呼び出し元のスレッドが渡されたものと同じ場合にpthread_join()a を返すと書かれています。EDEADLK

私の質問は次のとおりです。それは大丈夫ですか?(とにかくすぐにスレッドをうまく終了するので、結合の失敗を無視しますか?) または、それは避けるべきものですか?

4

3 に答える 3

5

実行中のスレッド自体から確実に呼び出すことができpthread_join()ます。呼び出し自体が適切に処理され、エラー コードが返されることがわかりました。ただし、いくつかの問題があります。

  1. 結合は何も結合しないため、意味がありません。それは単にあなたが何か間違ったことをしていることをあなたに伝えるだけです.
  2. スレッド自体は、それ自体を呼び出しpthread_join()ても終了しません。
  3. スレッドが存在していても、その状態は適切にクリーンアップされません。pthread_join()スレッドが「切り離された」ものとして作成されていない限り、他のスレッド (つまり、アプリケーションのメイン スレッド) が呼び出す必要があります。

言い換えれば、このアプローチはプログラムのバグと同じくらい受け入れられます。

Shutdown()解決策として、設計を再検討し、適切な場所から適切なタイミングで呼び出されることを確認することをお勧めします。結局のところ、「シャットダウン」という名前は、何かをシャットダウンするわけではないため、ここではあまり意味がありません。スレッドが終了するのを待つだけで、終了後にその状態をクリーンアップします。

ワーカー スレッドを終了するには、スレッド ルーチンから戻るか、 を呼び出しますpthread_exit()。次に、スレッドを開始した人が を呼び出してクリーンアップするようにしpthread_join()ます。

スレッドを強制的に停止させたい場合は、 を使用pthread_kill()してスレッドにシグナルを送ることを検討するか、代わりに、スレッドに実行中の処理を停止するように「指示」するために使用できる何らかのメッセージ パッシングを実装することを検討してください。

于 2013-05-17T14:58:38.800 に答える
1

スレッドを呼び出してから終了しないのはなぜですかpthread_detach(pthread_self());。もう呼び出す必要pthread_join()はなく、失敗する危険があります。

于 2013-05-17T14:45:38.330 に答える
1
   The pthread_join() function may fail if:

   EDEADLK
          A deadlock was detected or the value  of  thread  specifies  the
          calling thread.

私はあなた自身の責任で使用すると言います。

于 2013-05-09T15:04:25.040 に答える