多线程中对同一socket调用send/sendto

本文讨论了在多线程环境下,对TCP和UDP的socket调用send的安全性。对于TCP,由于可能存在短读短写和粘包问题,即使send在某些系统中是线程安全的,但在实际应用中直接多线程调用仍可能导致数据错乱。因此建议在TCP中使用单线程处理socket读写以确保数据顺序。而UDP由于其协议特性,保证了报文边界,因此可以在多线程中安全地调用send。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

群里问多线程环境中对一个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保证包的完整性)  ,意思是你要么 发送/接受 完一个包, 要么就丢包;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值