Windows: 使用事件进行共享内存同步

Windows: Using events for shared memory synchronization

我正在使用事件来同步访问共享内存的两个进程。我想要实现的目标如下所示:

进程 A:进程 B 的信号事件

进程A:等到进程B回复

进程B:接收事件,进行内存操作

进程 B:进程 A 的信号事件

进程B:等到进程A回复

总而言之,我有两个进程应该交替访问共享内存,同时确保它们仅在收到来自另一个进程的信号后才起作用。

这是我创建事件的方式(它在内核中创建并在驱动程序和用户模式程序之间共享):

ZwCreateEvent(&hEvent, EVENT_ALL_ACCESS, &oa, SynchronizationEvent, FALSE);

以下是我在用户模式程序中打开事件的方式:

HANDLE ghWriteEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, TEXT("Global\WriteEvent01"));

这是我目前在用户模式中发出事件信号的方式:

SetEvent(ghWriteEvent);
ResetEvent(ghWriteEvent);
WaitForSingleObject(ghWriteEvent, INFINITE);

这就是我在内核中发出 even 信号的方式:

KeSetEvent(kEvent, LOW_REALTIME_PRIORITY, FALSE);
KeResetEvent(kEvent);
KeWaitForSingleObject(kEvent, Executive, KernelMode, TRUE, NULL);

我使用 SetEvent() 以便其他进程收到信号,然后使用 ResetEvent() 以便 WaitForSingleObject() 只有在收到来自其他进程的信号时才会成功。

这是同步两个进程的正确方法吗?我不确定,因为这在 90% 的时间里都有效,但有时却无效。

例如当我在调用 WaitForSingleObject() 后将内容打印到控制台时,它会起作用。当我删除打印件时,同步有时会失败。这让我相信同步调用之间需要有一定的延迟。

我是否忽略了一个明显的错误?谢谢。

正如 Jonathan Potter、RbMm 和 Michael 指出的那样,仅使用一个事件进行同步是不可靠的,因为您必须使用 "PulseEvent"。

我的问题的解决方案是使用两个事件。一种用于发出内核模式已完成的信号,另一种用于发出用户模式已完成的信号。这解决了我的问题。