代码跳过等待多个事件的指令

Posted

技术标签:

【中文标题】代码跳过等待多个事件的指令【英文标题】:Code skipping the instruction of waiting for multiple events 【发布时间】:2020-05-09 21:39:50 【问题描述】:

我正在 Visual Studio 19 中用 C++ 编写一个程序,该程序等待 640 个事件发生(在这种情况下,它只是一个包含 640 个 HANDLE 的数组,其中每个位置需要向右或向左移动,这并不重要)。

嗯,所有这些都被初始化为

for(i=0; i<640; i++)
    vector[i]=CreateEvent(NULL, true, false, NULL);

问题在于,最重要的线程是等待所有事件发生的线程,我会这样做:

WaitForMultipleObjects(640, vector, TRUE, INFINITE);

我有一个资本问题,即我的代码出于某种原因跳过了该行。有没有人可以告诉我发生了什么或给我一个替代解决方案?

【问题讨论】:

检查结果,如果WAIT_FAILED调用GetLastError获取扩展错误信息。 我没有看到您在 CreateEvent 通话中检查 NULL。我也没有看到您检查 WaitForMultipleObjects 的返回值(和 GetLastError)。 minimal reproducible example 也将是首选。否则,一切都只是猜测。 此外,具有一次显式等待 640 个句柄的设计确实是一个不寻常的设计。它意味着相同数量的线程(对于一个进程来说很多)或者可以合并为更少的句柄和事件的东西。你能详细说明你真正想要做什么吗?也许有更好的方法。 shole 项目可能存在另一种结构,但我想不出比这更快的任何结构。我现在正在检查东西,如果它不起作用,我将使用信号量代替(我更习惯于它们)。谢谢你们@selbie “但我想不出比这更快的任何东西”。嗯,我可以。 :) 【参考方案1】:

根据WaitForMultipleObjects 的文档,可以等待的最大句柄数由MAXIMUM_WAIT_OBJECTS 给出。搜索 Windows 头文件显示它被定义为

#define MAXIMUM_WAIT_OBJECTS 64     // Maximum number of wait objects

WinNT.h。所以你在等待太多的对象。

由于您想等待所有这些,您可以尝试将您的请求分解成小的、可管理的大小块。

【讨论】:

这正是发生的事情。谢谢。

以上是关于代码跳过等待多个事件的指令的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个块中等待多个块事件

如何用chrome修改js代码,跳过网站等待时间

多个线程等待一个事件?

跳过 SemaphoreSlim 而不是等待

c/c++ 多线程 多个线程等待同一个线程的一次性事件

如何等待多个 C# 事件?