これには 2 つの側面があります。
- C 実装の機能。
- カーネルの機能。
カーネルに関しては、これをサポートするか、それに応じてエラーを発生させるかのいずれかであると確信しています。read() の C 実装は単なる syscall ラッパー ( read が Linux socket に対して呼び出された後に何が起こるかを参照) であるため、これは何も変更しません。ただし、そこに文書化された保証はまだ見当たらないので、これは信頼できません。
本当に 2 つのスレッドが必要な場合は、stdio 関数 (fopen/fread/fwrite/fclose) を使用することをお勧めします。これは、glibc がこれらの呼び出しを相互排他ロックと内部的に同期させるという事実を利用できるためです。
ただし、1 つのスレッドでブロッキング読み取りを実行している場合、他のスレッドは何かを書き込むためにブロックされる可能性があります。これはデッドロックになる可能性があります。そのための解決策は、 select() を使用して、読み取りの準備ができているデータまたは書き込みのバッファ領域があることを検出することです。ただし、これは単一のスレッドで行われますが、最初のコードは少し大きくなりますが、最終的にはこのアプローチの方が簡単でクリーンです。複数のストリームが関係している場合はなおさらです。