【发布时间】:2015-08-17 14:59:30
【问题描述】:
DWORD bytes;
ULONG_PTR key; ChatOverlappedData* ol;
if (!GetQueuedCompletionStatus(hComp_, &bytes, &key, (LPOVERLAPPED*)&ol, 0)) {
return false;
}
int type = ol->getNetType();
if (type == net::kAction_Accept) {
onAccept(ol, bytes, key);
} else if (type == net::kAction_Recv) {
onRecv(ol, bytes, key);
} else if (type == net::kAction_Send) {
}
return true;
考虑以下场景,
客户端alice向服务器发送了两个命令,由三个数据包p1p2p3组成。前两个包形成第一个命令c1,第三个包形成第二个命令c2。在onRecv函数中,服务器需要将数据包推送到某种命令缓冲区中,形成完整的命令。
但是假设有三个线程t1t2t3,每个线程从GetQueuedCompletionStatus获取一个数据包(p1,p2,p3),
由于 windows 是抢占式操作系统,线程 t2 可以在 t1、t3 之前运行。结果命令缓冲区将为p2->p1->p3 或p2->p3->p1。
如何保证将数据包推送到命令缓冲区的动作线程安全?
【问题讨论】:
标签: multithreading winapi winsock iocp