gpt4 book ai didi

c++ - 在 C++ 中创建/打开事件并检查它们是否被触发

转载 作者:行者123 更新时间:2023-11-30 04:40:57 25 4
gpt4 key购买 nike

我有两个使用事件进行同步的线程。在每个线程中,他们使用相同的调用:

::CreateEvent( NULL,TRUE,FALSE,tcEventName )

生产者线程是第一个进行调用的线程,而消费者线程最后进行调用,所以从技术上讲它是打开的,而不是创建事件...我假设。

但是,当在生产者线程中调用 SetEvent 时,同一事件永远不会在消费者线程中触发(我正在使用 WaitForMultipleObjects())

是否有工具可以告诉我事件是否真的被正确触发。

此外,当我在每个线程中调用 CreateEvent() 时,每个线程返回的句柄值都不同...它们应该相同吗?

有没有更好的方法来确保它能正常工作?

这是在 Windows XP 上使用 Visual Studio 2005

编辑:我做了更多检查,发现在生产者线程(第二个调用 CreateEvent 的线程)中调用 CreateEvent 会将 LastError 设置为 183 (ERROR_ALREADY_EXISTS),但是 CreateEvent 仍然返回事件的句柄......给出了什么?它怎么会出错,因为它已经存在但仍然返回一个句柄?或者它应该这样做吗?

最佳答案

根据 CreateEvent 的 MSDN 文档,

If the function succeeds, the return value is a handle to the event object. If the named event object existed before the function call, the function returns a handle to the existing object and GetLastError returns ERROR_ALREADY_EXISTS.

根据您的描述,我认为您的操作没有问题。我没有看到任何迹象表明您做错了什么。不过,对我来说,我通常使用 CreateEvent() 创建一次事件,然后将句柄传递给我希望由该事件发出信号的线程。但是您的方法在技术上没有任何问题。

您确实意识到 WaitForMultipleObjects() 返回句柄数组中第一个发出信号的句柄的索引,对吗?例如,如果您的命名事件是列表中的第二个事件,但绝大多数时间第一个句柄都发出信号(例如,通过快速执行的线程或发出信号但从未重置的手动重置事件),WaitForMultipleObjects () 将始终返回 WAIT_OBJECT_0。换句话说,您的消费者线程永远不会看到您的命名事件已发出信号的事实,因为第一个句柄“始终”发出信号。如果是这种情况,请将您命名的事件放在列表的第一位。

您不会碰巧将 WaitForMultipleObjects() 的 bWaitAll 参数设置为 TRUE 吧?如果这样做,则 handles 数组中的所有句柄都已在函数返回之前发出信号。

谁为您命名的事件调用了 ResetEvent()?应该是消费者。它不会意外地被某些第三方线程调用,是吗?

这些只是一些需要仔细检查的东西。如果该事件仍未按预期运行,请将 WaitForMultipleObjects() 替换为 WaitForSingleObject() 以查看您的命名事件是否正确地向使用者线程发出信号。

希望这对您有所帮助。

关于c++ - 在 C++ 中创建/打开事件并检查它们是否被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/600228/

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