【问题标题】:Is calling WSASend() and WSARecv() from two threads safe when using IOCP?使用 IOCP 时从两个线程调用 WSASend() 和 WSARecv() 是否安全?
【发布时间】:2015-02-27 17:22:53
【问题描述】:

基于此article,从多个线程调用WSASend()WSARecv() 是不安全的。但是,从两个线程同时调用WSASend()WSARecv() 是否安全?

【问题讨论】:

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

标签: c++ multithreading sockets iocp


【解决方案1】:

在一个线程中从一个套接字读取,同时在另一个线程中写入同一个套接字总是安全的。涉及单独的内核缓冲区。无论您使用的是阻塞、非阻塞、重叠还是 IOCP I/O 逻辑。

不安全的是在多个线程中同时从同一个套接字读取,或者在多个线程中同时写入同一个套接字。这需要线程之间的同步,以便它们传输/接收的数据不会相互重叠。

【讨论】:

  • 这只是部分正确。它是线程安全的,只是不尊重排序。在 UDP 套接字上同时发送/接收是很常见的,例如,排序无关紧要。
  • 并发发送+接收没问题。并发recv+recv,并发send+send,都不行。我从来没有说过任何关于线程安全的事情。这完全是另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2017-07-15
  • 1970-01-01
相关资源
最近更新 更多