群里问多线程环境中对一个socket进行send 可以不可以;
答:
这个问题不是多线程问题 , 是TCP / UDP 的问题;
如果是tcp ,这是个错误的设计,如果你无视数据顺序,那可以 ; 如果是udp可以;
TCP:
在win32上,我没有找到send是否线程安全, 但找到了WSASend并不是线程安全的.因此假设send也不是线程安全的,仅仅假设;
在posix 2008以后,send 和 recv都是线程安全的;
对于tcp而言,就算send/recv全是线程安全的, 直接调用send 这也是极其会出问题的,原因在于对tcp的recv和send 都存在着
短读和短写的毛病, 具体原因:tcp 粘包问题 ,
即使你解决了粘包这一系列问题,也有极大的可能因为线程竞争原因写入或接受错误的数据,
比如 tcp 粘包问题 拿这里面的 send_msg 来说, 假设 send 是线程安全的, 但在此函数内多线程会发生竞争,
比如: A线程先安全的写入了20字节, 此时B抢占到了,又安全的写入了30字节 ; 这个结果明显不是我们要的线程安全;
因此因此, 对于tcp来说最好还是一个线程来处理socket读/写, 来保证数据顺序正确;
结论就是不论 send / recv 是不是线程安全的,都没毛用;
UDP:
UDP是一个“保留消息边界” (UDP保证包的完整性) ,意思是你要么 发送/接受 完一个包, 要么就丢包;