Is socket.send thread safe?
Dmitry Olshansky
dmitry.olsh at gmail.com
Tue Mar 27 06:22:00 UTC 2018
On Monday, 26 March 2018 at 16:14:31 UTC, Jonathan wrote:
> Can I send data over an std.socket on multiple threads without
> manual mutexing?
>
> If not, can I send data on a separate thread than receive?
>
> The docs for std.socket say nothing of it (which I guess means
> I should assume it is not thread safe but...).
It’s thin-wrapper over system interface.
It’s thread-safe in that system will not topple over, you will
likely get some interleaving of data.
HOWEVER: there is such a thing as short-writes, which means that
since OS buffer may fill up it could write less then you intended
to and return that amount. It certainly happens with O_NONBLOCK.
In normal blocking mode it might work, but in general it’s a bad
idea to do writes to a single socket from multiple threads w/o
some coordination s.t. only can do it at any given time.
Lastly as far as guarantees go, POSIX doesn’t state that 2 writes
will be interleaved “exactly”, it may for instance splice them
zebra-style by some chunk size and I could imagine why (on long
buffers).
My suggestion is to have a queue of messages and a thread to send
them. You might also want to check and see if there is a better
protocol then TCP to take advantage of unordered messages. I
think there is at least RDP (reliable datagram protocol) on Linux
that might fit the bill.
>
> Thanks!
More information about the Digitalmars-d-learn
mailing list