【发布时间】:2018-08-26 05:52:08
【问题描述】:
我想创建一个 IOCP 应用程序来接收 TCP 数据,一旦收到,我将不得不处理数据并部分写出字节。了解带有 IOCP 的 WSASend 可以完成这项工作。但我担心 WSASend 是否同步到队列和 GetQueuedCompletionStatus 是否同步?例如:-
void processing_from_other_thread(...) {
...
DWORD state = still_doing1;
WSASend( ..,..,.., &state, .. );
DWORD state = still_doing2;
WSASend( ..,..,.., &state, .. );
DWORD state = still_doing3;
WSASend( ..,..,.., &state, .. );
DWORD state = Done;
PostCompletionQueue(....);
}
从上面的上下文来看,GetQueuedCompletionStatus 会让它们有序吗?
GetQueuedCompletionStatus();
return still_doing1
GetQueuedCompletionStatus();
return still_doing2
GetQueuedCompletionStatus();
return still_doing3
GetQueuedCompletionStatus();
return Done
Continue
我只是想确保未来的设计是正确的,恐怕它们不是有序的,例如,return still_doing2在still_doing1之前完成。发送的数据可能会影响到客户端。
【问题讨论】:
-
'发送的数据可能会影响到客户端'好吧,TCP套接字流将确保每个套接字的数据将按照发送顺序传输到对等方,但IOCP不保证完成通知将按顺序处理(甚至由同一个处理程序线程)。
-
在发送数据的情况下,完成通知顺序通常无关紧要。发送缓冲区/s 被释放、删除或重新池化,如果没有错误,那就是真的,所以任何订单或处理程序线程都会这样做:) 然而,接收完成通常需要更仔细的处理。
-
@Martin James 让我试着理解你的意思。如果仅在单线程环境中,我执行 WSASend1、WSASend2、WSASend3,当获取队列时,它可能会得到 3、1、2? 1、3、2?但是发送的数据肯定是1,2,3?
-
使用 TCP 套接字,当然,否则流式传输协议将被彻底破坏。