【发布时间】:2015-02-27 17:22:53
【问题描述】:
基于此article,从多个线程调用WSASend() 或WSARecv() 是不安全的。但是,从两个线程同时调用WSASend() 和WSARecv() 是否安全?
【问题讨论】:
-
什么? “两个线程”对您来说不是“多线程”吗?
-
我假设问题的措辞可以改进,而要问的是这个......“我可以从一个线程调用
WSASend(),同时从另一个线程调用WSARecv()相同的套接字而不会引起引用文章中突出显示的问题...”如果这是问题,那么您实际上是在问是否可以使用单独的锁来保护连接的每个“侧”,而不是在两者周围使用单个锁发送和接收。 -
它肯定是安全的,因为它不会崩溃,而且发送和接收缓冲区是独立的实体。因此,一个线程发送和一个线程接收不会受到伤害。不安全的是让两个(或更多)线程同时发送或同时接收。虽然这也是“安全的”——它不会崩溃或这样……只是它们将以未指定的顺序同时写入缓冲区(或从缓冲区中删除数据),这几乎肯定不会给出一致的、有意义的结果。请注意,例如
printf在这方面同样“不安全”。 -
@Len Holgate 这正是我的意思:-)
标签: c++ multithreading sockets iocp