2016-12-14 20 views
0

POSIX standardによれば、パイプへの書き込みはアトミック(データサイズがPIPE_BUF未満の場合)になることが保証されています。POSIXパイプ書き込みのアトミック性の意味

私が理解する限り、これは、パイプに書き込もうとしているスレッドは、別のスレッドの書き込み途中でパイプにアクセスすることはないということです。私には分かりませんが、これがどのように達成され、この原子性の保証が他の意味を持つかどうかです。

これは、書き込みスレッドが書き込み関数内のどこかでロックを取得したことを意味しますか?

パイプへの書き込みスレッドは、書き込み操作中にコンテキストからスケジューリングされないことが保証されていますか?

+0

あなたの推論はどれも標準で保証されていないので、それを何とかしてください。あなたが知っていることは、あなたの書き込みが他の書き込みとインターリーブされないことです。これを行うためのロックを取得するかどうかは実装の詳細なので、標準によって何らかのスケジューリングの保証はできません。唯一のことは、あなたのスレッドが書き込み保留中であれば、他のスレッドがパイプに書き込むことができないということです。write()が呼び出されてから返されるまでの間にスケジューラとスレッドの間で何が起こったのですかあなたのビジネスの:) – iluvcapra

答えて

0

パイプの書き込みは、パイプのサイズまでアトムです。パイプのサイズが4kbであるとすると、書き込みはデータサイズのアトムになります。< 4kb。 POSIXシステムでは、カーネルは内部ミューテックスを使用し、パイプのファイル記述子をロックします。次に、要求スレッドに書き込みを許可します。他のスレッド要求がこの時点で書き込みを行うと、最初のスレッドを待たなければなりません。その後、ファイルディスクリプタのロックが解除され、他の待機中のスレッドがパイプに書き込むことができます。だから、カーネルは、複数のスレッドが同時にパイプに書き込むことを許可しません。

しかし、考えるべきエッジケースがあります。 4KBに近いサイズのデータ​​がすでに書き込まれており、読み込みがまだ行われていない場合、パイプはスレッドセーフではない可能性があります。この時点では、パイプに書き込まれた合計バイト数が4kbの制限を超えている可能性があります。

関連する問題