Windows 中的进程间同步屏障
Posted
技术标签:
【中文标题】Windows 中的进程间同步屏障【英文标题】:Interprocess synchronization barrier in Windows 【发布时间】:2012-03-09 05:19:06 【问题描述】:我正在尝试在 Windows 中的不同进程之间建立障碍。它们本质上是同一进程的两个副本(不能将它们作为两个单独的线程而不是进程运行)。 这个想法是在程序的不同阶段设置障碍,以确保两个过程同时开始每个阶段。 在 Windows 中实现此功能的最有效方法是什么?
【问题讨论】:
【参考方案1】:使用命名事件(请参阅CreateEvent 和 WaitForSingleObject API 函数)。每个屏障需要两个事件 - 每个事件在应用程序的另一个实例中创建。然后两个实例都等待对方的事件。当然,这些事件可以在以后用于另一个障碍。
虽然存在一种复杂性 - 由于事件名称是全局唯一的(为了简单起见,我们这样说),每个事件都有不同的名称,可能以实例的进程 ID 为前缀。因此,应用程序的每个实例都必须获取另一个实例的 ID,才能找到另一个实例创建的事件的名称。
如果您有一个窗口应用程序,您可以广播一条消息,通知应用程序的第二个实例第一个实例的存在。
【讨论】:
谢谢。这就说得通了。我想因为我只使用两个进程,所以我可以使用任何 IPC 方法来发送实例进程 ID。我很好奇,如果我有可变数量的实例,您将如何广播您提到的消息? @cloudraven 快速而肮脏的方法是利用 BroadcastSystemMessage (msdn.microsoft.com/en-us/library/windows/desktop/…) 。正确的方法是枚举窗口(EnumWindows(),如果没记错的话)并将消息发送到每个窗口。 请记住,您需要使用 ManualReset 事件,并在尝试引发它时检查您自己的事件(从每个进程的角度来看)是否尚未引发,作为屏障(否则您将由于事件重用而失去同步;您可以使用 WaitOne(0) 检查状态 - 当它为真时,休眠一会儿,然后才引发您的事件)。 [代码]while (myEvent.WaitOne(0)) Thread.Sleep(10); myEvent.Set() partnerEvent.WaitOne() partnerEvent.Reset()[/code]以上是关于Windows 中的进程间同步屏障的主要内容,如果未能解决你的问题,请参考以下文章