小编Alb*_*lby的帖子

从Visual Studio启动时,C#ReleaseMutex()不会在控制台应用程序的多个实例中释放互斥量

我编写了一个示例控制台应用程序,该应用程序创建了一个互斥体,如下面的代码示例所示。我通过按Ctrl + F5(不使用调试器运行该应用程序)直接从Visual Studio(VS2013)启动此应用程序。对于控制台应用程序的第一个实例,我获取了互斥锁,控制台中显示以下行:

已建立新执行个体...

但是,当我Ctrl + F5再次使用创建控制台应用程序的第二个实例时,我在控制台中收到以下消息:

实例已获取...

即使我使用以下代码行在500ms后明确释放了互斥锁:

mut.ReleaseMutex();
Run Code Online (Sandbox Code Playgroud)

在获取互斥量的同一线程中,我仍然看到控制台应用程序的第二个实例等待互斥量被释放。

有人可以向我解释为什么会这样,如果我做错了什么,可以纠正我吗?据我了解,ReleaseMutex应该从通过mut.WaitOne(0)调用获取该互斥锁的同一个线程中释放该互斥锁,以便应为所有等待获取互斥锁的线程提供所有权。但是,在这种情况下,我看不到它起作用。

如果我关闭获取互斥量的第一个实例(仍然是我的第二个实例),并尝试使用启动第三个实例Ctrl+F5,我可以看到有一个AbandonedMutexException

未处理的异常:System.Threading.AbandonedMutexException:由于放弃了互斥,等待已完成。

PS:有趣的是,我可以通过将false互斥量构造函数作为

static Mutex mut = new Mutex(false, "Global\\test");
Run Code Online (Sandbox Code Playgroud)

这有什么意义initiallyOwned参数的

public Mutex(bool initiallyOwned, string name);
Run Code Online (Sandbox Code Playgroud)

互斥体类的构造函数版本?

从VS运行2个实例的控制台输出

class Program
{
    static Mutex mut = new Mutex(true, "Global\\test");

    static void Main(string[] args)
    {

        if (IsInstance())
        {
            Console.WriteLine("New Instance created...");
        }
        else
        {
            Console.WriteLine("Instance already acquired...");
        }

        Console.ReadLine();
    }
    static bool IsInstance() …
Run Code Online (Sandbox Code Playgroud)

c# multithreading mutex

3
推荐指数
1
解决办法
1072
查看次数

标签 统计

c# ×1

multithreading ×1

mutex ×1