2011-01-05 7 views
1

私はLinux上でpthreadsを使用しています。私のスレッドの1つは、定期的にデバイスファイル記述子のwrite関数を呼び出します。書き込み呼び出しが完了するまでに時間がかかる場合は、他のスレッドを実行できるようにスレッドが一時停止されますか?私はpthreadのスケジューリング機能を設定していないので、私の質問はデフォルトのスレッドの動作に関するものです。スレッド内のI/Oのブロックに関する質問

答えて

4

他のスレッドが同じリソースに書き込もうとしても、書き込みスレッドが書き込みを完了するのを待っている間に、他のスレッドが実行されます。

+0

これは理にかなっているようですが、pthreadのデフォルトのスケジューリング動作を記述したドキュメントは見つかりませんでした。 – Ravi

+0

私はこれが興味深い読書であることを発見しました:http://www.icir.org/gregor/tools/pthread-scheduling.html – cubic1271

+0

ありがとう、それは役立ちます。 – Ravi

0

デバイスファイル記述子が共有リソースの場合は、ロックを処理する必要があります。しかし、いったんスレッドセーフであれば、そのような共有リソースへの呼び出しはシリアル化されます。したがって、あるスレッドが書き込みを行うと、残りのスレッドはブロックされます。ロックが実装されていない場合、データが文字化けする可能性があります。

+0

私のファイル記述子は共有されていません。一つのスレッドに固有です。そのスレッドが完了するまでに時間がかかる場合は、スケジュールされますか? – Ravi

+0

各スレッドに独自のファイル記述子がある場合、競合は発生しないため、他のスレッドがブロックされる理由はありません。しかし、あなたの質問にはファイル記述子があり、いくつかのスレッドがあるので、ファイル記述子は共有されていると仮定しました。 – Schultz9999

+0

これは競合についての質問ではありません。問題は、1つのスレッドがファイルディスクリプタへの書き込みを完了するのに時間がかかり、他のスレッドがどのようにスケジュールされるのかです。 – Ravi

2

write()コールブロックの場合、呼び出しスレッドのみが中断されます。これはPOSIX spec for write()に記載されています:

すぐ を書き込まれるように要求されたすべての データのための十分なスペースがある場合、実装は そうすべきです。そうでなければ、呼び出し側スレッド がブロックされることがあります。つまり、書き込みに十分なスペースがあるまで、 まで一時停止します。それはプロセスを呼び出していないスレッドを呼び出すと言うこと

注意。

1

原則的に定義されているかどうかを確認し、YES、他のスレッドを実行することができます。

しかし、一部のファイルシステムでは、1つのファイルに対して1つの同時IO操作しか許可されないロック機構があることに注意してください。したがって、別のスレッドが別のファイル記述子を介している場合でも、同じファイル上の別のIOを実行すると、write()システムコールの持続時間の間、ブロックされる可能性があります。

その他の機能には、他のカーネル内のロックもあります。しかし、彼らは密接に関連する活動をしていない限り、他のスレッドの実行をブロックしません。

関連する問題