C++ 在C+中创建/打开事件+;检查他们是否被解雇

C++ 在C+中创建/打开事件+;检查他们是否被解雇,c++,windows,multithreading,events,C++,Windows,Multithreading,Events,我有两个线程使用事件进行同步。 在每个线程中,它们使用相同的调用: ::CreateEvent( NULL,TRUE,FALSE,tcEventName ) 生产者线程是第一个发出呼叫的线程,而消费者线程是最后一个发出呼叫的线程,所以从技术上讲它是开放的,而不是创建事件。。。我想是吧 但是,当在生产者线程中调用SetEvent时,消费者线程中永远不会触发相同的事件(我使用的是WaitForMultipleObjects()) 是否有一个工具可以告诉我事件是否被正确触发 另外,当我在每个线程中调

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

::CreateEvent( NULL,TRUE,FALSE,tcEventName )
生产者线程是第一个发出呼叫的线程,而消费者线程是最后一个发出呼叫的线程,所以从技术上讲它是开放的,而不是创建事件。。。我想是吧

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

是否有一个工具可以告诉我事件是否被正确触发

另外,当我在每个线程中调用CreateEvent()时,返回的句柄值对于每个线程都是不同的。。。它们应该是一样的吗

有没有更好的方法来确保它的有效性

这是在Windows XP上使用Visual Studio 2005实现的

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

您的代码应该按照您所描述的那样工作。如果在尝试创建事件时该事件已存在,则将获得现有事件的句柄

每个线程的句柄是不同的,所以您不必担心它们是否不同(它们应该是不同的)


我建议你简化一点,看看事情是否按照你期望的方式进行。您使用WaitForMultipleObjects()的事实告诉我您还有其他事情要做。如果您认为它不起作用,请扔掉其他东西,看看是否能解决问题。

如果您在一个进程中只使用几个线程,为什么不将事件句柄从一个传递到另一个呢?据我所知,创建命名内核对象是为了在进程之间共享它们


您还可以尝试使用OpenEvent函数打开已创建的事件。这可能会给出一些想法。

在单个进程中,您只需调用CreateEvent一次,并共享所有线程中返回的句柄


此外,除非希望外部进程使用OpenEvent访问事件,否则不需要命名事件。事实上,如果您命名事件,则只有一个程序副本能够成功调用CreateEvent。

根据MSDN文档

如果函数成功,则返回值是事件对象的句柄。如果命名事件对象在函数调用之前存在,则函数将返回现有对象的句柄,GetLastError将返回ERROR_ready_EXISTS

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

您知道WaitForMultipleObjects()返回句柄数组中第一个有信号句柄的索引,对吗?例如,如果您的命名事件是列表中的第二个事件,但第一个句柄在绝大多数情况下都会发出信号(例如,通过一个快动作线程或一个发出信号但从不重置的手动重置事件),WaitForMultipleObjects()将始终返回WAIT_OBJECT_0。换句话说,您的使用者线程将永远不会看到您的命名事件被标记的事实,因为第一个句柄是“始终”标记的。如果是这种情况,请将命名事件放在列表的第一位

您没有将WaitForMultipleObjects()的bWaitAll参数设置为TRUE,是吗?如果这样做,则在函数返回之前,句柄数组中的所有句柄都已发出信号

谁为您的命名事件调用ResetEvent()?应该是消费者。它不是偶然被第三方线程调用的,是吗

这些只是一些需要仔细检查的事情。如果事件的行为仍不符合预期,请将WaitForMultipleObjects()替换为WaitForSingleObject(),以查看命名事件是否正确地向使用者线程发送信号


希望这有帮助。

MSDN说CreateEvent在返回已存在的句柄时,会准确地设置已存在的错误的最后一个错误。我会更仔细地检查对象名称,也许你正在打开其他事件?或者WaitForMultipleObjects调用。我也不确定,但我认为同一个进程的不同线程中同一事件的事件句柄应该相等。它们在不同的过程中可能不同。