C# 如何使用互斥或EventWaitHandler同步4个不同的进程
我发现了几种使用命名互斥锁或.Net中可用的其他锁同步两个不同进程的方法,但我没有发现如何使用两个以上的进程来同步 我需要同步访问共享资源的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)) {
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部分。正确使用互斥(注意如何使用所拥有的变量)以获得正确的结果是很重要的。