1

スレッドが現在ブロックされているかどうかを判断する方法を知っている人はいますか? 基本的に、特定のスレッドがブロックされているかどうかを確認し (この場合は AF_UNIX データグラム ソケット受信呼び出しで)、ブロックされている場合は中断するようにシグナルを送信します。

私はBoost.Threadを使用してLinuxに取り組んでおり、その下でpthreadsを使用しています。私のシステムには NPTL があります。

答えは「いいえ」だと思いますが、何か不足しているかどうかを確認したいと思います。

4

2 に答える 2

2

これは簡単には不可能です(デバッガー向けの機能を使用することは可能ですが、単純でも、移植可能でも、安全でもありません)。

このような使用には固有の競合状態があるため、とにかくこれを実際に実行する必要はありません。スレッドがブロックされる直前にブロックされているかどうかを確認するか(この場合、スレッドをスリープ解除できなくなる可能性があります)、ブロックしていることがわかった直後にブロックを停止する場合があります。

問題を解決するための通常の方法は、「セルフパイプトリック」です。

  • pipe();でパイプを作成します。
  • ターゲットスレッドは、でブロックする代わりに、またはrecvfrom()でブロックします。監視するファイル記述子には、データグラムソケットとパイプの読み取り端が含まれます。poll()select()
  • ターゲットスレッドをウェイクアップするために、他のスレッドはパイプの書き込み端に1バイトを書き込みます。

(ここでブロックしたくないので、フラグrecvfrom()を使用するように変更する必要があります。代わりに、常に/でブロックします)。MSG_DONTWAITpoll()select()

于 2011-02-10T01:59:44.413 に答える
0

答えはノーだ。あなたのプラットフォームでこれを行う方法があるかもしれませんが、一般的にこれを行う方法はありません.

ここで、プラットフォームの下位レベルのドキュメントに飛び込む前に、これが本当に必要かどうかをよく考えてください。

スレッドは常に何らかの理由でブロックされます。たとえば、FILE IO でブロックされている可能性があります。戻り値を正しく処理すれば、これは安全に中断できます。一方、スレッドは、新規/削除呼び出しまたは別の標準ライブラリ関数内でブロックされることもあります。ランタイム ライブラリ内のスレッドを中断することは、災害の領収書です。

ここで質問する理由があることは承知していますが、より高いレベルの観点から問題を考え、そのようなハッキングなしで目標を達成できるように設計を修正する方がよいでしょう。

于 2011-02-09T15:36:24.067 に答える