各操作の前の開発者がソケットで実行され、複数のスレッドが読み書きする必要がある既存のシステムを維持しています。以前の開発者は、コントロールとミューテックスの下で io 操作を実行しました。C ソケット IO 操作を相互に除外する必要はありますか? それとも、ソケットが全二重であるため、ミューテックスの使用は冗長ですか? スレッドは 1 つだけ
スレッドがオブジェクトを入れる処理キューが共有メモリであり、それを相互に排除するように注意する必要があることに疑いの余地はありません。
各操作の前の開発者がソケットで実行され、複数のスレッドが読み書きする必要がある既存のシステムを維持しています。以前の開発者は、コントロールとミューテックスの下で io 操作を実行しました。C ソケット IO 操作を相互に除外する必要はありますか? それとも、ソケットが全二重であるため、ミューテックスの使用は冗長ですか? スレッドは 1 つだけ
スレッドがオブジェクトを入れる処理キューが共有メモリであり、それを相互に排除するように注意する必要があることに疑いの余地はありません。
ソケットはデフォルトではスレッドセーフではありません。したがって、複数のスレッドがそれらに対して読み取りと書き込みを行う場合は、何らかの方法でアクセスをロックする必要があります(たとえば、ミューテックスを使用)。
TCP(AF_INET、SOCK_STREAM)の場合、同期されていないリーダースレッド(recv)とライタースレッド(send)があっても問題ありません。
しかし、あなたの説明からは、コードでミューテックスがどのような目的で使用されているかは明確ではありません。「以前の開発者」は、ソケットのためではなく、アプリケーションプロトコルの要件のためにネットワーク操作を同期したように見えます。多くのアプリケーションは、次のように通信を実行します。
lock
-> send request
<- recv reply
unlock
lock
-> send request
<- recv reply
unlock
send / recvペアを同期するには、ここでロックが必要です(複数のスレッドが関係している場合)。そうしないと、アプリケーションプロトコルが一致しない要求と応答の混乱になる可能性があります。