2011-02-09 9 views
1

スレッドが現在ブロックしているかどうかを判断する方法を知っている人はいますか?基本的には、あるスレッドが(この場合はAF_UNIXデータグラムソケット受信呼び出しで)ブロックしているかどうかをチェックし、もしあればそれを割り込み信号にします。スレッドがブロックされているかどうかを確認する

私はLinuxでBoost.Threadの意味を使っています。私はpthreadsを使っています。私のシステムはNPTLを持っています。

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

+0

すでにBoost :: Threadを使用している場合、Boost :: asioを使用して読んでみませんか? – Max

+0

私が知る限り、Boost.Asioは私の問題を解決しません。スレッドが現在ブロックしているかどうかを判断し、スレッドがあれば中断する必要があります。 Boost.Asioは一般的には役に立ちますが、この問題は解決しません。 – deuberger

答えて

2

これは簡単ではありません(デバッガ向けの機能を使用することは可能ですが、シンプルでポータブルで安全です)。

このような使用には本質的な競合状態があるため、実際にはこれをやりたいとは限りません。スレッドがブロックしようとする直前にスレッドがブロックしているかどうかをチェックすることができます。

あなたの問題を解決するための通常の方法は、「自己パイプのトリック」である:

  • pipe()とのパイプを作成します。
  • recvfrom()でブロックするのではなく、対象のスレッドはpoll()またはselect()のブロックになります。監視するファイルディスクリプタには、データグラムソケットとパイプの読み込み側が含まれます。
  • ターゲットスレッドをウェイクアップするには、もう一方のスレッドがパイプの書き込み側に1バイトを書き込みます。

recvfrom()は、我々がここにブロックすることはありませんので、また、MSG_DONTWAITフラグを使用するように変更され、代わりに常にpoll()/select()でブロックする必要があります)。

0

答えはいいえです。あなたのプラットフォームでこれを行う方法があるかもしれませんが、一般的に私はこれを行う方法がないことを知っています。

スレッドは常に理由でブロックされて:あなたは、お使いのプラットフォームの下位レベルのドキュメントに飛び込む前に、

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

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

+0

良い点...ありがと...あなたはBoost.Threadsでこれを行う方法がない、あるいはpthreads/NPTLでもできないと言っていますか?私はそれが事実だと思うので、私は私がやりたいとは思わないもっと低いレベルに戻らなければならないでしょう。 – deuberger

関連する問題