首页 > 解决方案 > c# Mutex 死锁

问题描述

我们有以下代码:

        public static Mutex AcquireMutex(string name)
        {
            bool ndgMutexAcquired;
            Mutex ndgMutex = new Mutex(true, name, out ndgMutexAcquired);

            if (!ndgMutexAcquired)
            {
                try
                {
                    ndgMutex.WaitOne();
                }
                catch (AbandonedMutexException)
                {
                }
            }

            return ndgMutex;
        }

我有一个父进程,在任务中,我调用 AcquireMutex,运行一些代码,然后释放它。在另一个任务中,我调用了一个子进程,该子进程也调用了同名的 AcquireMutex,然后立即调用 release。看来这是陷入僵局了。我认为唯一的事情是“最初拥有”参数可能需要为 false,如下所示:

        public static Mutex AcquireMutex(string name)
        {
            Mutex ndgMutex = new Mutex(false, name);
            try
            {
                ndgMutex.WaitOne();
            }
            catch (AbandonedMutexException)
            {
            }

            return ndgMutex;
        }

我真的不明白为什么这会有所帮助,但它似乎。谁能帮我理解为什么这可能会死锁以及正确的解决方法是什么?

这是在子进程中调用 Acquire mutex 的代码

            using (var mutex = MutexExtensions.AcquireMutex(@"Global\auth_mutex"))
            {
                LogHelper.LogInfo("Releasing mutex since it was successfully acquired");
                mutex.ReleaseMutex();
            }

在父进程中:

            return Task.Run(() =>
            {
                Logger.LogInfo("Acquiring mutex ...");
                using (var mutex = MutexExtensions.AcquireMutex(@"Global\auth_mutex"))
                {
                    Logger.LogInfo("Auth mutex acquired");
                    // Stuff done here (external process call) ~~~~~~~~~~~~

                    // Mutex.Dispose doesn't implicitly release the mutex
                    Logger.LogInfo("Releasing mutex");
                    mutex.ReleaseMutex();

                    return new TaskResult(true);
                }
            });

标签: c#mutex

解决方案


推荐阅读