【发布时间】:2015-03-05 11:28:32
【问题描述】:
我知道为了同时调用WSASend(),我需要为每个调用提供一个唯一的WSAOVERLAPPED 和WSABUF 实例。但这意味着我必须为每次调用跟踪这些实例,这会使事情变得复杂。
我认为,如果我创建一个线程来不是同时调用,而是顺序调用,那将是一个更好的主意。该线程将等待一个队列,该队列将持有WSASend() 请求(每个请求将包含套接字句柄和我要发送的字符串)。当我最终调用WSASend() 时,我将阻塞线程,直到我收到来自等待完成端口的线程的唤醒信号,告诉我WSASend() 已经完成,然后我继续获取下一个请求。
如果这是个好主意,那么我应该如何实现队列以及如何对其进行阻塞提取调用(而不是使用轮询)?
【问题讨论】:
-
第一个问题是对等方是否能够理解所有这些并发发送。真的可以吗?
-
@EJP 是的,每个
WSASend()调用都会发送一条定义长度且彼此不相关的消息。 -
听起来你应该对我使用阻塞 I/O,并使用互斥锁对其进行序列化。比你在这里提出的要简单得多。
-
@EJP 但是我想处理成千上万的客户端,所以阻塞 I/O 是行不通的。
-
如果你打算使用发送者线程,你可以在排队/出队时使用同步机制来锁定队列。应该够了。
标签: c++ multithreading sockets iocp