Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
I/O完成端口上有多个线程 我正在使用I/O完成端口在C++套接字服务器上工作。我按照一些文章的建议为每个处理器创建一个I/O端口和两个工作线程,以便处理重叠的I/O活动_C++_Windows_Multithreading_Winapi_Io Completion Ports - Fatal编程技术网

I/O完成端口上有多个线程 我正在使用I/O完成端口在C++套接字服务器上工作。我按照一些文章的建议为每个处理器创建一个I/O端口和两个工作线程,以便处理重叠的I/O活动

I/O完成端口上有多个线程 我正在使用I/O完成端口在C++套接字服务器上工作。我按照一些文章的建议为每个处理器创建一个I/O端口和两个工作线程,以便处理重叠的I/O活动,c++,windows,multithreading,winapi,io-completion-ports,C++,Windows,Multithreading,Winapi,Io Completion Ports,据我所知,在任何时候,这些工作线程中只有一个应该被唤醒并处理I/O请求。因此,当一个客户端只连接并发送某个内容时,我所期望的是只有一个线程要唤醒并处理该接收,但当我尝试调试它时,我可以看到多个线程唤醒并尝试处理同一操作 我的假设错了吗 您如何确定多个线程正在处理同一操作?您做了什么来阻止两个线程从同一套接字读取?您在创建IOCP时指定了并发线程的最大数量。如果有多个线程处理同一个项目,那么代码中的某些内容出错。IOCP概述可能会对您有所帮助:我在messageReceived函数中放置了一个断点

据我所知,在任何时候,这些工作线程中只有一个应该被唤醒并处理I/O请求。因此,当一个客户端只连接并发送某个内容时,我所期望的是只有一个线程要唤醒并处理该接收,但当我尝试调试它时,我可以看到多个线程唤醒并尝试处理同一操作


我的假设错了吗

您如何确定多个线程正在处理同一操作?您做了什么来阻止两个线程从同一套接字读取?您在创建IOCP时指定了并发线程的最大数量。如果有多个线程处理同一个项目,那么代码中的某些内容出错。IOCP概述可能会对您有所帮助:我在messageReceived函数中放置了一个断点,因为我收到的消息足够小,可以放在缓冲区中,因此我希望调用该断点一次。目前,我有一个关键部分来保护对客户端接收缓冲区的访问,并且在每个客户端中都有单独的接收和发送缓冲区。当我创建IOCP时,我将0传递为线程数,从而让操作系统决定要做什么。IIRC,如果有多个WSARecv I/O请求从多个线程排队,这是可能的。IOCP可以向一个客户端套接字的多个工作线程发出I/O完成的信号-内核IOCP线程池会尽可能快地填充IO请求中传递的缓冲区,并将它们提交到完成队列&因此,包含来自单个客户端的数据的多个缓冲区最终可能会被不同的工作线程处理。一条足够小到可以放入一个I/O缓冲区的“消息”并不保证数据将全部加载到一个缓冲区中——它仍然可能被拆分为两个或更多个缓冲区。