0

この質問は、Breaking a condition variable deadlockからの質問です。多数のスレッドが条件変数を待機している可能性があります。スレッド 1 などの特定のスレッドにのみシグナルを送信し、デッドロック シナリオの参加者であったスレッドを強制終了する必要があります。多くの中で特定のスレッドだけを知らせる方法はありますか.

いくつかの助けに感謝します

ありがとう

編集; Nemo のコメントを尊重します。これは悪い考えだと理解しています。しかし、それを行う方法はありますか

4

2 に答える 2

1

延期されたキャンセルポイントを使用できます。スレッドで使用しますpthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldstate);(これはデフォルトですが、明示的にすることは決して害にはなりません)。pthread_setcancelstate次に、キャンセル可能にするための条件変数待機を除いて、キャンセルを無効にします。pthread_cleanup_push必ずキャンセルクリーンアップハンドラーの設定に使用してください。これはRAIIではうまく機能しません。

そして今、あなたはあなたのスレッドをpthread_cancelすることができます。キャンセルクリーンアップハンドラーが登録の逆の順序で実行され、TLSデータデストラクタが呼び出され、スレッドが終了します(条件変数waitから戻ることなく)。

もちろん、これはかなり醜いデザインです。理想的には、デッドロックをまったく回避する必要があります。それが不可能な場合、それが私である場合、一度に1つのcvarでブロックするスレッドを1つだけ配置し、複数のcvarを処理するために、これらのcvarに基づいてより高いレベル(明示的なウェイターリスト)の構成を構築します。ウェイターは、スレッドを個別にアドレス指定できるようにします。

于 2011-08-03T05:19:22.607 に答える
0

必要なことを正確に行うためのコードを書くだけです。条件変数はこの動作を提供しないため、近道はありません。だからただ書いてください。難しいことは何もありません。たとえば、特別なフラグを設定し、条件変数でブロックされているすべてのスレッドをウェイクアップし、フラグをチェックしてスリープに戻る必要があるかどうかを確認するようにスレッドをコーディングできます。

于 2011-08-28T12:12:47.807 に答える