C# 如何使用互斥或EventWaitHandler同步4个不同的进程

C# 如何使用互斥或EventWaitHandler同步4个不同的进程,c#,.net,multithreading,locking,C#,.net,Multithreading,Locking,我发现了几种使用命名互斥锁或.Net中可用的其他锁同步两个不同进程的方法,但我没有发现如何使用两个以上的进程来同步 我需要同步访问共享资源的4个不同进程。我试过: bool createdNew; using (EventWaitHandle eventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset, MutexName, out createdNew)) {

我发现了几种使用命名互斥锁或.Net中可用的其他锁同步两个不同进程的方法,但我没有发现如何使用两个以上的进程来同步

我需要同步访问共享资源的4个不同进程。我试过:

        bool createdNew;
        using (EventWaitHandle eventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset, MutexName, out createdNew))
        {
            if (!createdNew)
            {
                eventWaitHandle.WaitOne();
            }

 ... Critical section

            eventWaitHandle.Set();
        }
但仅适用于2个进程,当设置句柄时,所有等待进程同时启动


有什么想法吗?

您仍然可以使用互斥锁:

static void Main(string[] args) {
    bool owned;
    // first process will achieve ownership here, when creating
    var mutex = new Mutex(true, "mymutex", out owned);
    try {
        if (!owned) {
            // other processes will wait here, but only one will be released at a time
            owned = mutex.WaitOne();
        }
        Console.WriteLine($"Using the mutex on process {Process.GetCurrentProcess().Id}");
        Console.ReadLine();
    }
    finally {
        if (owned)
            // if we own mutex - release to allow next processes to come in.
            mutex.ReleaseMutex();
    }
}

当然,您可能希望将其包装到方便的IDisposable类中。不要忘记在
WaitOne

中设置适当的超时。您希望发生什么?在任何给定的时间,4个进程中只有一个能够进入关键部分。您需要分配一个主进程,一个拥有互斥锁的主进程。并处理所有其他令人讨厌的小细节,比如其中一个进程意外终止。很难恢复,所以它需要杀死其他所有人。你确定吗?在EventWaitHandle中,当事件被设置时,所有等待的进程都被释放。是的,我用4个进程测试了上面的代码,它们一个接一个地进入了Critical部分。正确使用互斥(注意如何使用所拥有的变量)以获得正确的结果是很重要的。