web-dev-qa-db-ja.com

Pthreadライブラリのスレッドを強制終了

私はpthread_create(&thread1, &attrs, //... , //...);を使用し、何らかの条件が発生した場合、このスレッドを殺す必要がありますか?

39
Sajad Bahmani

最初にスレッドIDを保存します

pthread_create(&thr, ...)

後で電話する

pthread_cancel(thr)

ただし、これは推奨されるプログラミング方法ではありません!セマフォやメッセージなどのスレッド間通信メカニズムを使用して、実行を停止する必要があることをスレッドと通信することをお勧めします。

Pthread_kill(...)は実際に受信スレッドを終了するのではなく、代わりにシグナルを配信することに注意してください。これは、シグナルとシグナルハンドラーに依存します。

55
Antti Huima

この問題には2つのアプローチがあります。

  • signalを使用します。スレッドは、フラグを設定するsigaction()を使用してシグナルハンドラをインストールし、スレッドは定期的にフラグをチェックして終了する必要があるかどうかを確認します。スレッドを終了する必要がある場合、pthread_kill()を使用してスレッドにシグナルを発行し、pthread_join()で終了するのを待ちます。このアプローチでは、子スレッドが終了シグナルを処理する前にシグナルハンドラーを既にインストールしていることを保証するために、親スレッドと子スレッド間の事前同期が必要です。
  • キャンセルポイントを使用します。スレッドは、キャンセル機能が実行されるたびに終了します。スレッドを終了する必要がある場合は、pthread_cancel()を実行し、pthread_join()で終了するのを待ちます。このアプローチでは、リソースリークを回避するために、pthread_cleanup_Push()およびpthread_cleanup_pop()を詳細に使用する必要があります。これらの最後の2つの呼び出しは、コードの字句スコープを混乱させる可能性があり(_{_および_}_トークンを生成するマクロである可能性があるため)、適切に維持することは非常に困難です。

pthread_detach()を使用して既にスレッドをデタッチしている場合、pthread_join()を使用してスレッドを再度結合することはできません。)

どちらのアプローチも非常に難しい場合がありますが、特定の状況ではどちらかが特に役立つ場合があります。

22
alecov

私はAnttiに同意します。より良い方法は、スレッドが終了すべきかどうかをチェックするチェックポイントを実装することです。これらのチェックポイントは、ロック付きの共有変数や、スレッドが設定されているかどうかをチェックするイベントなど、さまざまな方法で実装できます(スレッドはゼロ時間待機することを選択できます)。

6
Fredrik Jansson

pthread_kill()関数を見てください。

2
Wyzard
pthread_exit(0) 

これはスレッドを殺します。

0
Anand Paul