gpt4 book ai didi

multithreading - 如何确保iocp中的线程安全接收?

转载 作者:行者123 更新时间:2023-12-03 13:19:35 25 4
gpt4 key购买 nike

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向服务器发送了两个命令,该命令由三个数据包 p1 p2 p3组成。前两个包形成第一个命令 c1,第三个包形成第二个命令 c2。在 onRecv函数中,服务器需要将数据包插入某种命令缓冲区以形成完整的命令。

但是假设有三个线程 t1 t2 t3,每个线程都会从 p1获得一个数据包( p2p3GetQueuedCompletionStatus),

由于Windows是抢占式操作系统,因此线程 t2可以在 t1t3之前运行。结果命令缓冲区将为 p2-> p1-> p3p2-> p3-> p1

如何确保线程安全,以便将数据包推送到命令缓冲区?

最佳答案

最简单的解决方案是在每个方向上每个套接字仅尝试一个重叠的I/O请求。因此,请发布一个重叠的读取操作,完成后,在处理完第一个操作后再发布另一个。

发布多个这样的操作非常复杂,因为即使将按顺序发布完成,处理完成的线程也可能会无序执行,并且您必须进行一些痛苦而复杂的跟踪。

对于同一连接,在同一方向上发布多个重叠的操作的好处非常小。证明附加的复杂性几乎是远远不够的。对于处理大量连接的服务器,通常根本不值得做,因为额外的内存消耗(或使用较小的缓冲区大小)实际上会使性能变差。

IOCP的主要好处是可以更有效地发现哪些连接需要工作,以及可以有效地将这些工作分配给线程池。这就是最大可连接800个服务器的服务器与可处理10,000个连接而又不费吹灰之力的服务器之间的区别。

关于multithreading - 如何确保iocp中的线程安全接收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32053666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com