代码跳过等待多个事件的指令
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
。所以你在等待太多的对象。
由于您想等待所有这些,您可以尝试将您的请求分解成小的、可管理的大小块。
【讨论】:
这正是发生的事情。谢谢。以上是关于代码跳过等待多个事件的指令的主要内容,如果未能解决你的问题,请参考以下文章