【发布时间】:2011-02-13 02:54:57
【问题描述】:
Win32 API PulseEvent() 函数 (kernel32.dll) 的文档指出该函数“……不可靠,不应由新应用程序使用。相反,使用条件变量”。但是,条件变量不能像(命名的)事件那样跨流程边界使用。
我有一个跨进程、跨运行时(本机和托管代码)的场景,其中单个生产者偶尔会向 零 个或更多消费者提供一些有趣的东西。现在,生产者使用这个 PulseEvent 函数使用(并设置为有信号状态)一个众所周知的命名事件,当它需要让某些事情知道时。零个或多个消费者等待该事件(WaitForSingleObject()) 并执行操作作为响应。在我的场景中不需要双向通信,生产者不需要知道事件是否有任何侦听器,也不需要知道需要知道事件是否被成功执行。另一方面,我不希望任何消费者永远错过任何事件。换句话说,系统需要完全可靠 - 但生产者不需要知道是不是这样。这个场景可以被认为是一个“时钟计时器”——即生产者为零个或多个消费者提供一个半规则的信号来计数。所有消费者必须在任何给定时间段内都有正确的计数。不允许消费者进行轮询(性能原因)。代码只有几毫秒(20 左右,但不是完全正常)。
Raymen Chen(旧新事物)has a blog post 指出 PulseEvent() 函数的“根本缺陷”性质,但我没有看到 Chen 或发布的 cmets 的替代方案。
谁能推荐一个?
请记住,IPC 信号必须跨越机器上的进程边界,而不仅仅是线程。并且解决方案需要具有高性能,因为消费者必须能够在每个事件的 10 毫秒内采取行动。
【问题讨论】:
标签: winapi synchronization ipc