2011-09-22 30 views
1

ここで状況はありますが、私は自分が所有していないコードによって部分的に制御されているスレッドを実行しています。私はスレッドを開始したので、スレッドIDを持っていますが、他のコードに渡しました。私は、他のコードが現在スレッドが他のスレッドからブロックする原因になっているかどうかを知る必要があります。 pthreadsでこれを行う方法はありますか?私はJavaのThreadクラス(http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#getState())のgetState()メソッドと同等のものを探していると思います。pthreadスレッドがブロックされていないか確認してください。

--------------編集-----------------

ソリューションはプラットフォームに依存している場合、それは大丈夫です。私はすでに/ procファイルシステムを使ってLinux用のソリューションを見つけました。

+0

あなたは実際に何を達成しようとしていますか? javaを模倣しようとする以外の方法があるかもしれません。 – Duck

+1

これはテストフレームワークのためのものです。私たちは、スレッドのスケジュールを制御して、明示的に定義されたスレッドスケジュールの下で再入可能なコードをテストできるようにしています。 –

答えて

2

いくつかのpthreads関数のラッパーを書くことができます。これは、元の関数を呼び出す前後に状態情報を更新するだけです。これにより、どのスレッドが実行中であるか、ミューテックスを取得または保持しているか、どの条件変数で待機しているかなどを把握できます。

もちろん、これはpthreads同期オブジェクトでブロックされたときにのみ表示されます。他のものでブロックしているときは通知されません。

+0

これは本当にうれしく、おそらく私はこのようなことをしています。彼らがI/Oのような何かをブロックしているかどうかを判断する方法があると思いますか? –

+0

私はそれを行う方法は、彼らが何をブロックしているかによって異なるかもしれないと思います。彼らが非アクティブで、pthreadsでブロックされていないと言うことができるなら、他の何かを待っていると言うのは安全でしょう。しかし、何かを見つけることは複雑かもしれません。私は確かに多くを言うには十分にそれを調べていない。 – Dmitri

-1

スレッドを他のコードに渡す前に、ミューテックスで保護されたフラグを設定してください。コントロールしていないコードからスレッドが戻ると、mutexで保護されているフラグをクリアします。必要に応じて、スレッドが制御できないコードに含まれているかどうかを確認できます。

コード外からは、ブロックされていないブロックとブロックされていないブロックの区別はありません。スレッドの状態を文字通りチェックした場合は、無意味な結果になります。

たとえば、2つのライブラリの実装を考えてみましょう。

A:私たちはすべての作業を呼び出しスレッドで行います。

B:私たちは仕事をするワーカースレッドを送ります。呼び出し元のスレッドは、ワーカーが終了するまでブロックします。

どちらの場合も、制御しないコードでは、同じように順方向処理が行われます。あなたの「getstate」アイデアは、異なる結果をもたらします。それはあなたが望むものではありません。

+0

スレッドの状態(ブロックまたはブロックされていない)が変更される可能性があるため、これが機能しません。 –

+0

もちろん、どうして気にしますか? 1分後に操作がまだ進行中であるかどうかを確認する場合は、チェックした後に分割が完了するかどうかは気にしないでください。十分な時間が経過したと判断し、それがまだ進行中であると判断した場合、あなたは取り返しのつかないで放棄することに決めなければなりません。あなたは、あなたが尋ねた「getstate」と同じ状況になります。 –

+0

私が気にしている理由については、元の質問に対して行ったコメントを見てください。 –

関連する問題