首页 > 解决方案 > C#:持有命名信号量的进程在没有释放的情况下死亡

问题描述

我正在使用命名信号量在 C#.NET Framework 上使用进程间同步。这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace csharp_dot_net_frame
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Semaphore semaphoreObject = new Semaphore(initialCount: 1, maximumCount: 1, name: "my_sem");
                Console.WriteLine("Waiting for semaphore");
                semaphoreObject.WaitOne();
                Console.WriteLine("Semaphore lock acquired");
                Thread.Sleep(10000);
                semaphoreObject.Release();
                Console.WriteLine("exiting.");
                Console.ReadLine();
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
                Console.ReadLine();
            }
        }
    }
}

当我运行两个实例(进程)时P1,说P2上面的代码,P1首先运行P2并杀死P1已经获取信号量而不释放保持信号量的另一个进程,然后另一个进程无限期P2地等待信号量semaphoreObject.WaitOne();死锁。我希望那P2绝对应该有机会等待,semaphoreObject无论是否P1死亡。

在UNIX C++ 端 using的这篇文章中解决了同样的问题lockf,想知道 C# 中是否也存在某种类似的替代方案。我是 C# 方面的新手,有人可以帮助我如何在 C#.Net 上解决这个问题。

还请建议我在 Win32 C++ 上的同步机制,它不会出现上述死锁情况。

谢谢。

标签: c#c++visual-c++synchronization

解决方案


推荐阅读