You can basically read from a socket and write to it in another thread simultaneously without critical sections. However, with Synapse, there is one problem: Both the reading and writing changes the FLastError and FLastErrorDesc properties.
I've worked around the problem by overriding RecvPacket and SendBuffer.