is winsock2 thread safe?

Yes, sockets are thread-safe, however you have to be careful. One common pattern (when using blocking IO) is to have one thread receiving data on a socket and another thread sending data on the same socket. Having multiple threads receiving data from a socket is usually fine for UDP socket, but doesn’t make much sense for TCP sockets most of the time. There is a warning in the documentation for WSARecv:

WSARecv should not be called on the same socket simultaneously from
different threads, because it can result in an unpredictable buffer
order.

But this usually isn’t of any concern if you are using UDP and the protocol is stateless.

Also note that the WSAEINPROGRESS error code mainly applies to Winsock 1.1:

WSAEINPROGRESS: A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.

And the description of WSAEINPROGRESS further states:

Operation now in progress.

A blocking operation is currently executing. Windows Sockets only allows a single blocking operation—per- task or thread—to be outstanding, and if any other function call is made (whether or not it references that or any other socket) the function fails with the WSAEINPROGRESS error.

Note that this talks about a single blocking operation per-task or thread.

Furthermore there is an additional warning in the documentation for WSARecv:

Issuing another blocking Winsock call inside an APC that interrupted an ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.

But apart from those warnings you should be fine.

Update: to add some external references:
alt.winsock.programming: Is socket thread-safe?
and Winsock Programmer’s FAQ: Is Winsock thread-safe?

Leave a Comment