【问题标题】:Interprocess synchronization barrier in WindowsWindows 中的进程间同步屏障
【发布时间】:2012-03-09 05:19:06
【问题描述】:

我正在尝试在 Windows 中的不同进程之间建立障碍。它们本质上是同一进程的两个副本(不能将它们作为两个单独的线程而不是进程运行)。 这个想法是在程序的不同阶段设置障碍,以确保两个过程同时开始每个阶段。 在 Windows 中实现此功能的最有效方法是什么?

【问题讨论】:

    标签: windows synchronization ipc


    【解决方案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]
    猜你喜欢
    • 2013-12-15
    • 2011-08-06
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2015-03-09
    • 2013-08-31
    • 2017-10-19
    相关资源
    最近更新 更多