はい、ソケットはスレッドセーフですが、注意が必要です。1 つの一般的なパターン (ブロッキング IO を使用する場合) は、1 つのスレッドがソケットでデータを受信し、別のスレッドが同じソケットでデータを送信することです。ソケットからデータを受信する複数のスレッドを持つことは、通常、UDP ソケットでは問題ありませんが、ほとんどの場合、TCP ソケットではあまり意味がありません。WSARecvのドキュメントに次の警告があります。
WSARecv は、異なるスレッドから同時に同じソケットで呼び出されるべきではありません。これは、予期しないバッファー順序になる可能性があるためです。
ただし、UDP を使用していて、プロトコルがステートレスである場合、これは通常は問題になりません。
WSAEINPROGRESS
また、エラー コードは主に Winsock 1.1 に適用されることに注意してください。
WSAEINPROGRESS: ブロッキング Windows Sockets 1.1 呼び出しが進行中か、サービス プロバイダーがまだコールバック関数を処理中です。
そしてWSAEINPROGRESS
さらなる状態の説明:
現在作戦進行中。
ブロッキング操作が現在実行中です。Windows ソケットでは、1 つのブロック操作 (タスクまたはスレッドごと) のみを未処理にすることができます。他の関数呼び出しが行われた場合 (それがそのソケットまたは他のソケットを参照しているかどうかに関係なく)、関数は WSAEINPROGRESS エラーで失敗します。
これは、タスクまたはスレッドごとの単一のブロック操作について話していることに注意してください。
さらに、WSARecv のドキュメントには追加の警告があります。
同じスレッドで進行中のブロッキング Winsock 呼び出しを中断した APC 内で別のブロッキング Winsock 呼び出しを発行すると、未定義の動作が発生するため、Winsock クライアントによって試行されてはなりません。
しかし、それらの警告は別として、あなたは大丈夫なはずです。
更新: いくつかの外部参照を追加するには:
alt.winsock.programming: Is socket thread-safe?
Winsock Programmer's FAQ: Winsockはスレッドセーフですか?