1. ホーム
  2. c

[解決済み] 同一ソケットでのsend/recvの並列呼び出しは有効ですか?

2022-06-11 11:15:44

質問

  1. 同じソケット上で、あるスレッドから send を、別のスレッドから recv を呼び出すことはできますか?
  2. 同一ソケット上の異なるスレッドから複数のsendを並列に呼び出すことは可能か?

良い設計がこれを避けるべきであることは分かっていますが、これらのシステム API がどのように動作するかは明確ではありません。また、同じものについての良いドキュメントを見つけることができません。

方向へのどんなポインタでも役に立ちます。

どのように解決するのですか?

POSIX では、send/recv はアトミックな操作として定義されているので、POSIX send/recv について話していると仮定すれば、はい、複数のスレッドから同時に呼び出して動作させることが可能です。

これは必ずしもそれらが並行して実行されることを意味しません。複数の送信の場合、2番目は最初の送信が完了するまでブロックされる可能性があります。 複数の送信の場合、2 番目の送信は最初の送信が完了するまでブロックされる可能性が高く、おそらくこのことにあまり気づかないでしょう。

SOCK_STREAM ソケットを使用している場合、send/recv がメッセージの一部のみを送信または受信する可能性があり、物事が分割される可能性があるため、並行して物事を行うことはあまり有用ではありません。

SOCK_STREAMソケットのブロッキング送受信は、少なくとも1バイトを送受信するまでしかブロックしないので、ブロッキングとノンブロッキングの差は意味がないのです。