- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 HANDLE 列表,由许多不同的 IO 设备控制。之间的(性能)差异是什么:
WaitForMultipleObjects 是 O(n) 时间复杂度吗?n 个句柄?
您可以以某种方式在 windows::basic_handle 上调用 async_read 对吗?或者这个假设是错误的?
如果我在多个线程中调用同一个 IO 设备上的运行,处理调用是否会在这些线程之间平衡?这将是使用 asio 的主要好处。
最佳答案
因为它听起来像是您从 asio 派生的主要用途,所以它构建在 IO 完成端口(简称 iocp)之上。因此,让我们开始比较 iocp 和 WaitForMultipleObjects()
。这两种方法在本质上与 linux 上的 select
和 epoll
相同。
iocp 解决的 WaitForMultipleObjects
的主要缺点是无法使用许多文件描述符进行扩展。它是 O(n),因为对于您收到的每个事件,您再次传入完整数组,并且内部 WaitForMultipleObjects 必须扫描数组以了解触发哪个句柄。
但是,由于第二个缺点,这很少成为问题。 WaitForMultipleObjects()
对其可以等待的最大句柄数有限制 (MAXIMUM_WAIT_OBJECTS
)。此限制为 64 个对象(请参阅 winnt.h)。通过创建 Event 对象并将多个套接字绑定(bind)到每个事件,然后等待 64 个事件,可以绕过此限制。
第三个缺点是 WaitForMultipleObjects()
中实际上有一个微妙的“错误”。它返回触发事件的句柄的索引。这意味着它只能将单个事件传回给用户。这与 select
不同,后者将返回触发事件的所有文件描述符。 WaitForMultipleObjects
扫描传递给它的句柄并返回引发其事件的第一个句柄。
这意味着,如果您正在等待 10 个非常活跃的套接字,并且大多数时候所有这些套接字上都有一个事件,那么将非常偏向于为传递给 的列表中的第一个套接字提供服务等待多个对象
。这可以通过以下方式规避,每次函数返回并且事件已被服务时,再次运行它,超时为 0,但这次只传递数组 1 中触发事件的部分。重复直到访问了所有句柄,然后返回到具有所有句柄和实际超时的原始调用。
iocp 解决了所有这些问题,还引入了一个更通用的事件通知接口(interface),非常好。
使用 iocp(以及因此使用 asio):
我不确定您对自定义句柄使用 async_read
的假设。你可能需要测试一下。如果您的句柄指的是套接字,我想它会起作用。
至于线程问题;是的。如果您在多个线程中run()
io_service
,事件将被分派(dispatch)到一个空闲线程,并将随着更多线程的扩展而扩展。这是 iocp 的一个特性,它甚至有一个线程池 API。
简而言之:我相信 asio 或 iocp 会提供比简单地使用 WaitForMultipleObjects
更好的性能,但这种性能是否会使您受益主要取决于您拥有多少句柄以及它们的活跃程度。
关于c++ - WaitForMultipleObjects 和 boost::asio 在多个 windows::basic_handle 上有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6201759/
如果我有以下 C++ 代码(适用于 Windows 操作系统): HANDLE hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); HANDLE hMut
我有一个事件循环正在等待几个自动重置事件。使用 CreateEvent(NULL, false, false, NULL) 将事件全部初始化为数组 eventHandles_。 while (true
在我的一个项目中,我创建了多个自动重置事件和两个线程,线程使用WaitForMultipleObjects 在继续运行之前等待一些事件,例如: HANDLE hTerminateEvent = Cr
您知道 c 中的 Windows 库中的 WaitForMultipleObjects 函数正在获取作为对象数组的参数。但是在我的作业中,助手想要将所有线程保存在一个堆栈中而不是一个数组中,我如何将这
我正在尝试为我的 FileWatcher 类编写单元测试。 FileWatcher 派生自 Thread 类并使用 WaitForMultipleObjects 在其线程过程中等待两个句柄: 从Fin
我正在使用 WaitForMultipleObjects 函数来等待多个线程的完成,但我做错了,因为结果不是预期的 查看示例代码 type TForm1 = class(TForm) Me
在下面的测试程序中,每个测试线程在开始执行时将其句柄添加到全局 TThreadList 中,并在执行即将结束时从同一列表中删除其句柄。 出于测试目的,此外,每个线程确保在主线程锁定列表之前添加其句柄(
我的理解是WaitForMultipleObjects和 CRITICAL_SECTION旨在等待线程完成。并且它们都被描述为线程之间的进程和线程同步机制。如果它们旨在实现相同的目标,它们可以互换使用
假设:我用自动重置事件填充了一个句柄数组,并使用 bWaitAll = FALSE 将其传递给 WaitForMultipleObjects。 来自 MSDN:“当 bWaitAll 为 FALSE
我有一个事件对象 vector ,用于 WaitForMultipleObjects 函数。事件发出信号后,我尝试使用关闭句柄函数关闭事件,但我收到类似 Invalid handle was spec
我正在尝试制作一个测试控制台应用程序,它使用不同的线程从不同的 COM 端口打开和下载数据。下载数据后,我使用 WaitForMutipleObjects() 等待所有线程完成下载。 WaitForM
我已经阅读了之前发布的问题,该问题似乎与我在使用等待多个对象时遇到的错误相同,但我相信我的情况有所不同。我正在使用多个线程来计算 mandelbrot 集的不同部分。该程序编译并产生大约 5 次中的
如果我正在使用 WaitForMultipleObjects,并且该函数返回 WAIT_TIMEOUT,我如何才能获取导致超时发生的一个或多个对象? 我的另一个问题是,如果有多个对象发出信号,因为返回
我目前正在编写一个程序,该程序将同时运行多个程序组和其他程序。 if( WAIT_FAILED == WaitForMultipleObjects(numberOfProgramsRan, &info
我正在使用 WaitForMultipleObjects在 IPC 情况下,我有一个进程将数据写入两个内存映射文件中的一个或两个,另一个进程在数据更新时获取该数据。当任一 MMF 中的数据发生更改时,
在 Java (v6) 中实现 WaitForMultipleObjects 的 Win32 等价物的最优雅方法是什么。线程一直处于 hibernate 状态,直到发生多个事件之一。发生这种情况时,我
我不熟悉 WINAPI,我正在寻找一种方法来替换在一个示例中使用的 WaitForMultipleObjects,我只使用 Qt 将其移植到 Qt。有可能吗? 编辑:(根据评论要求提供更多信息) 第
我需要在多平台项目中使用 WaitForMultipleObjects 功能。 我可以用 Boost 中的什么来替代它? 最佳答案 我找到了这个问题的答案:不存在。 但是我已经找到并回答了 http:
根据微软的文档MAXIMUM_WAIT_OBJECTS是64(要等待的最大句柄数),但有时由于某种原因(因为随机)WaitForMultipleObjects返回 WAIT_FAILED ($FFFF
我正在尝试编写一个等待客户端连接的代码。一旦连接到客户端,它就应该开始读取文件并发送它。 我需要通知套接字句柄,也就是说,如果连接从客户端丢失,它会通知我,以便我可以尝试重新连接。 最佳答案 如果连接
我是一名优秀的程序员,十分优秀!