.net core WebApi Mutex实现并发同步
2021-07-09 04:07
标签:summary 就是 产生 inf doc 异常 阻塞 控制台 ocs Mutex,中文译为互斥体,在.net中也是作为一种线程或进程之间的互斥体存在。即在同一时刻,一个共享资源只允许被某一个线程或进程访问,其他线程或进程需要等待(直至获取互斥锁为止)。 Mutex的使用方式与Monitor很相似,但绝不相同。Monitor支持线程间同发同步,Mutex不但支持线程也支持进程间并发同步。 Mutex有许多需要注意的地方,如果稍不注意,则你会被坑惨! 接下来我们使用控制台和webapi项目各自做测试。 一、使用控制台测试进程间的同步 测试代码如下: 同时打开两个程序的运行结果如下所示: 进程间的并发同步需要指定互斥体的名称,只要是同一个名称,它们就能互斥。 Mutex的WaitOne()方法是阻塞当前线程并等待获取互斥体。ReleaseMutex()方法是释放当前线程拥有的互斥体,如果当前进程或线程没有拥有互斥体Mutex,则会抛出System.ApplicationException异常,这点需要注意。 WaitOne和ReleaseMutex方法最好成对出现,反正单个方法两两不相见。 多个ReleaseMutex方法一起运行的异常见以下图片: 这个问题可以看ReleaseMutex方法的定义说明: 产生System.ApplicationException异常的原因就是当前被调用的线程已经不拥有该互斥体! 二、使用WebApi项目测试线程间的同步 .net core WebApi Mutex实现并发同步 标签:summary 就是 产生 inf doc 异常 阻塞 控制台 ocs 原文地址:https://www.cnblogs.com/williamwsj/p/9719529.html [STAThread]
static void Main(string[] args)
{
//使用指定名称为MName的互斥体
//如果名称为MName的互斥体已经不存在,则flag为true,否则为false
Mutex mutex = new Mutex(true, "MName", out bool flag);
if (flag) {
Console.WriteLine("1.获取互斥锁,开始运行");
Thread.Sleep(5000);
Console.WriteLine("2.释放互斥锁!");
mutex.ReleaseMutex();
Console.WriteLine("3.开始等待,5秒后超时!");
if (mutex.WaitOne(5000))
Console.WriteLine("6.获取互斥锁,开始运行!");
else Console.WriteLine("6.超时释放互斥锁!");
Thread.Sleep(1000);
}
else {
Console.WriteLine("1.未获取互斥锁,开始等待!");
mutex.WaitOne();
Console.WriteLine("4.获取互斥锁,开始运行!");
Console.WriteLine("5.释放互斥锁!");
mutex.ReleaseMutex();
}
Console.ReadKey();
}
///
文章标题:.net core WebApi Mutex实现并发同步
文章链接:http://soscw.com/index.php/essay/102611.html