c# - 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++ 上的同步机制,它不会出现上述死锁情况。
谢谢。
解决方案
推荐阅读
- javascript - 花括号外的展开运算符有什么作用?
- python-3.x - 优化组合的组合
- laravel - 雄辩地将 json 数组更新为字符串转换失败,但使用 save() 有效
- django - Django STATIC_URL 请求
- python - 使用按键重新启动 While 循环
- rust - Rust std 库中的所有宏都包含在前奏中吗?
- codenameone - 排除未使用的 .class 文件
- asp.net-core - ASP.NET Core 如何根据布尔值将用户重定向到页面
- java - 从 WSJdbcDataSource(连接池)解包 OracleConnection
- laravel - Laravel 模型未路由到视图