gpt4 book ai didi

c# - 跨进程互斥体实例化

转载 作者:行者123 更新时间:2023-12-04 10:05:04 27 4
gpt4 key购买 nike

刚刚编写了一个必须一次处理一次的简单程序,因此通过使用键控 Mutex 来实现这一点具有特定名称。
代码(简化)如下所示。

static readonly string APP_NAME = "MutexSample";

static void Main(string[] args)
{
Mutex mutex;
try
{
mutex = Mutex.OpenExisting(APP_NAME);
// At this point, with no exception,
// the Mutex is acquired, so there is another
// process running
// Environment.Exit(1); or something
}
catch (WaitHandleCannotBeOpenedException)
{
// If we could not acquire any mutex with
// our app name, let's create one
mutex = new Mutex(true, APP_NAME);
}

Console.ReadKey(); // Just for keeping the application up
// At some point, I just want to release
// the mutex
mutex.ReleaseMutex();
}

我的第一次尝试是实例化 Mutex喜欢 new Mutex(false, APP_NAME) , 但调用 mutex.ReleaseMutex()抛出异常

System.ApplicationException: 'Object synchronization method was called from an unsynchronized block of code.'



刚刚注意到构造函数的第一个参数 ( initiallyOwned) 标记了当前线程是否正在创建 Mutex拥有它,不出所料,线程无法释放 Mutex它不属于该线程。

所以把这个参数改成 true修复了该问题,如上面的代码所示。

好吧,我的问题是,该参数的全部意义是什么?我的意思是,我什么时候需要创建 Mutex我无法释放它。
而且,如果我设置参数 initiallyOwnedfalse , 谁真正拥有 Mutex ?

谢谢。

最佳答案

没有人拥有 Mutex , 除非它被某人通过调用它的方法 WaitOne 获得.路过initiallyOwned: true试图立即获得一个新创建的Mutex ,但这是有问题的。来自 documentation :

You should not use this constructor to request initial ownership, unless you can be certain that the thread will create the named mutex.



还有 an overload接受三个参数:
public Mutex (bool initiallyOwned, string name, out bool createdNew);

...但是创建 Mutex 更简单没有初始所有权,然后在您准备好被阻止时获得它(以防它恰好被其他人获得)。
mutex = new Mutex(initiallyOwned: false, APP_NAME);
mutex.WaitOne(); // Potentially blocking

关于c# - 跨进程互斥体实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61625034/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com