C#多线程中的互斥锁Mutex
作者:農碼一生 发布时间:2022-04-26 06:11:55
标签:C#,多线程,互斥锁,Mutex
一、简介
Mutex的突出特点是可以跨应用程序域边界对资源进行独占访问,即可以用于同步不同进程中的线程,这种功能当然这是以牺牲更多的系统资源为代价的。
主要常用的两个方法:
public virtual bool WaitOne() 阻止当前线程,直到当前 System.Threading.WaitHandle 收到信号获取互斥锁。
public void ReleaseMutex() 释放 System.Threading.Mutex 一次。
二、代码
案例一:
class Program
{
private static Mutex mutex = new Mutex();
static void Main(string[] args)
{
Thread[] thread = new Thread[3];
for (int i = 0; i < 3; i++)
{
thread[i] = new Thread(ThreadMethod1);//方法引用
thread[i].Name = "Thread-" + (i+1).ToString();
}
for (int i = 0; i < 3; i++)
{
thread[i].Start();
}
Console.ReadKey();
}
public static void ThreadMethod1(object val)
{
mutex.WaitOne();//获取锁
for (int i = 1; i <=5; i++)
{
Console.WriteLine("{0}循環了{1}次", Thread.CurrentThread.Name, i);
}
mutex.ReleaseMutex(); //释放锁
}
}
运行结果:
案例二:
class Program
{
private static Mutex mutex = new Mutex();
private static int sum = 0;
static void Main(string[] args)
{
Task<int> task = new Task<int>(ThreadFunction);
task.Start();
Console.WriteLine($"{DateTime.Now} task started!");
Thread.Sleep(2000);//Main主線程
Console.WriteLine($"{DateTime.Now} Get siginal in Main!");
mutex.WaitOne();
Console.WriteLine($"{DateTime.Now} Get siginal in main!");
Console.WriteLine($"{DateTime.Now} Result is {task.Result}");
Console.ReadKey();
}
private static int ThreadFunction()
{
Console.WriteLine($"{DateTime.Now} Get siginal in ThreadFunction!");
mutex.WaitOne();//获取锁
for (int i = 0; i <= 10; i++)
{
sum += i;
Thread.Sleep(1000);
}
Console.WriteLine($"{DateTime.Now} Release mutex in ThreadFunction!");
mutex.ReleaseMutex(); //释放锁
return sum;
}
}
运行结果:
三、总结
为避免发送多线程发生死锁,Mutex的WaitOne()和ReleaseMutex()需成对配合使用。
来源:https://www.cnblogs.com/wml-it/p/14822648.html


猜你喜欢
- 先记录下jdk8之前的一些帮助方法判断time是否在now的n天之内/** * 判断time是否在now的n天之内
- 在应用登陆页面我们需要填写用户名和密码。当填写这些信息的时候,软键盘会遮挡登陆按钮,这使得用户体验较差,所以今天就来解决这个问题1:登陆布局
- Bean是Spring框架中最核心的两个概念之一(另一个是面向切面编程AOP)。1 定义Spring 官方文档对 bean 的解释是:In
- 在 Java 语言中,运算符有算数运算符、关系运算符、逻辑运算符、赋值运算符、字符串连接运算符、条件运算符。算数运算符算数运算符是我们最常用
- Android-webview和js互相调用Android 和 H5 都是移动开发应用的非常广泛。市面上很多App都是使用Android开发
- 前言使用递归循环开发评论回复功能,适用于大部分的简单单体应用评论功能或许是大多数的单体应用之中会用到的功能,我们会在自己所开发的项目之中进行
- Java中的final关键字1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修
- Android标题栏最右边添加按钮的实例step1:重写activity的onCreateOptionsMenu方法@Override pu
- java 交换两个数据的方法1:利用数组,即先把要交换的数字放在数组中 ,比如在一些数组排序中可能用到public static void
- 本文实例为大家分享了C语言实现顺序表的顺序查找和折半查找的具体代码,供大家参考,具体内容如下顺序查找:#include <iostre
- 本文源码:GitHub·点这里 || GitEE·点这里一、Ehcache缓存简介1、基础简介EhCache是一个纯Java的进程内缓存框架
- 本文实例讲述了WPF的ListView控件自定义布局用法。分享给大家供大家参考,具体如下:概要:以源码的形式贴出,免得忘记后,再到网上查资料
- Android可以在所有应用上方添加View,就是给WindowManager添加一个View,在创建的View的时候可以给这个View设置
- 一.概念适配器模式将一个接口转换成客户希望的另外一个接口。它使得原来由于接口不兼容而不能在一起工作的那些类可以一起工作。二.UML 
- 本文实例讲述了C#修改IIS站点framework版本号的方法。分享给大家供大家参考。具体如下:使用ASP.NET IIS 注册工具 (As
- Eclipse Che被Eclipse官方称为下一代IDE,作为老牌的IDE,被其寄予厚望的Eclipse Che到底有什么特点,在这篇文章
- 本文总结分析了Android编程开发之EditText中inputType属性。分享给大家供大家参考,具体如下:android 1.5以后添
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:private SystemBarTintManager tintManager;@Ov
- 本文实例为大家分享了Android自定义Seekbar滑动条的具体代码,供大家参考,具体内容如下由于项目需要做出此效果,自定义写了一个。效果
- 1、前言 最近做项目需要用到监测网速及流量,我经过百度和墙内谷歌都没能快速发现监测IPV6流量和网速的用例;也经过自己的一番查询和调试,浪