4

Unix データグラム ソケットを使用する単純なクライアント サーバー アプリケーションを作成する必要があります。クライアントは、サーバーからの要求に応じてサーバーに情報を送信したり、自分自身からの要求に応じてサーバーから情報を受信したりできます。

サーバーに送信するリクエストを決定するユーザー入力を1つのスレッドが待機し、他のスレッドはサーバーからのソケット上のメッセージを待機するだけであるという考えがあります。サーバー要求スレッドがサーバーが要求したものを書き込む場合は、それを標準出力に書き込みます。2 つのスレッドが同時に同じソケットに書き込まないように、mutex を使用します。

私の質問は、あるスレッドがあるソケットから読み取り、同時に他のスレッドが同じソケットを使用してデータを送信する場合、ソケットはどのように動作するかということです。安全ですか? または、この状況でもミューテックスを使用する必要がありますか?

4

2 に答える 2

10

カーネル構造は通常、スレッドセーフな方法で構築されます。とソケットも例外ではありません。何か心配なことがあれば、それはソケットとスレッドを使用することの安全性ではなく、プログラムのロジックです。

また、ストリームソケットは全二重であるため、読み取り/書き込みが同時に安全に行われることが保証されていますが、これはどのように行うことができますか?カーネルがロックするか、送信と受信の両方を同時に実行できるようにします。

全二重引数の場合:
http ://www.kernel.org/doc/man-pages/online/pages/man2/socket.2.html カーネル構造はスレッドセーフです:
リンクが見つかりませんでしたこれをサポートするために、しかし私はそれについて99%確信しています。

PS疑わしい場合は、物事をテストすることが役立つかもしれません
編集:
私が言ったことの何かが間違っている場合は、反対票を投じる前にそれについてコメントしてください。


EDIT.2:ここで、POSIX標準では、セクション2.9.1 http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02
で定義されているリストを除いて、すべての関数がスレッドセーフである必要があると指定されていることがわかります。
.html

于 2012-06-02T15:22:59.357 に答える