5

私の質問は非常に簡単です。Linuxスレッドセーフでのシリアルポートとの読み書きはありますか? 異なるスレッドから同時に読み取りと書き込みを行うことはできますか? 同時に2つの書き込みを行うことさえ可能ですか? 私はそうするつもりはありませんが、これは他の人にとって興味深いかもしれません。読み取り用のスレッドと書き込み用のスレッドが 1 つずつあります。

このトピックについて見つけることはほとんどありません。

詳細 — で取得したファイル記述子に対して と をwrite()使用しています。そして私は同時にそうしています。read()open()

皆さんありがとう!

ロエル

4

1 に答える 1

3

これには 2 つの側面があります。

  1. C 実装の機能。
  2. カーネルの機能。

カーネルに関しては、これをサポートするか、それに応じてエラーを発生させるかのいずれかであると確信しています。read() の C 実装は単なる syscall ラッパー ( read が Linux socket に対して呼び出された後に何が起こるかを参照) であるため、これは何も変更しません。ただし、そこに文書化された保証はまだ見当たらないので、これは信頼できません。

本当に 2 つのスレッドが必要な場合は、stdio 関数 (fopen/fread/fwrite/fclose) を使用することをお勧めします。これは、glibc がこれらの呼び出しを相互排他ロックと内部的に同期させるという事実を利用できるためです。

ただし、1 つのスレッドでブロッキング読み取りを実行している場合、他のスレッドは何かを書き込むためにブロックされる可能性があります。これはデッドロックになる可能性があります。そのための解決策は、 select() を使用して、読み取りの準備ができているデータまたは書き込みのバッファ領域があることを検出することです。ただし、これは単一のスレッドで行われますが、最初のコードは少し大きくなりますが、最終的にはこのアプローチの方が簡単でクリーンです。複数のストリームが関係している場合はなおさらです。

于 2013-03-29T06:36:53.827 に答える