c# mutex互斥量的深入解析
发布时间:2022-03-13 02:38:42
互斥锁(Mutex)
互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它。
互斥锁可适用于一个共享资源每次只能被一个线程访问的情况
函数:
//创建一个处于未获取状态的互斥锁
Public Mutex();
//如果owned为true,互斥锁的初始状态就是被主线程所获取,否则处于未获取状态
Public Mutex(bool owned);
如果要获取一个互斥锁。应调用互斥锁上的WaitOne()方法,该方法继承于Thread.WaitHandle类
它处于等到状态直至所调用互斥锁可以被获取,因此该方法将组织住主调线程直到指定的互斥锁可用,如果不需要拥有互斥锁,用ReleaseMutex方法释放,从而使互斥锁可以被另外一个线程所获取
//Public Mutex(bool owned,name,out flag);
name为互斥量的名字,也就是说在操作系统中只有一个命名为name的互斥量mutex,如果一个线程得到这个name的互斥锁,其他线程就无法得到这个互斥锁了,必须等待那个线程对这个线程释放
参考别人的博客的代码实验
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace myConApp
{
class Test
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
bool flag = false;
System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", out flag);
//第一个参数:true--给调用线程赋予互斥体的初始所属权
//第一个参数:互斥体的名称
//第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true
if (flag)
{
Console.Write("Running");
}
else
{
Console.Write("Another is Running");
System.Threading.Thread.Sleep(5000);//线程挂起5秒钟
Environment.Exit(1);//退出程序
}
Console.ReadLine();
}
}
}
运行以上代码生成的应用程序第一个实例,会得到结果
Running
保持第一个运行状态,运行第二个实例,得到结果
Another is Running
以上代码中创建了一个mutex,从其参数的解释中得知,第一个调用线程将得到互斥体的初始所属权,如果不释放的话,其他的线程得不到互斥体所有权
1.运行两个工程,同时将以上代码放入工程中,第一个工程运行,得到结果
Running
保持第一个运行状态,运行第二个工程,得到结果
Another is Running
2.将一个工程中的System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", out flag);改为
System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test1", out flag);
然后第一个工程运行,得到结果
Running
保持第一个运行状态,运行第二个工程,得到结果
Running
则说明在系统中,mutex的name是在系统中是唯一的。


猜你喜欢
- 问题是这样的,我用eclipse发送httpclient请求如下没有问题,但是在idea中就返回400,为毛呢???excuse me?pa
- 本文实例讲述了C#图像边缘检测(Roberts)的方法。分享给大家供大家参考。具体如下://定义roberts算子函数private sta
- 大家最近都在讨论新鲜技术-flutter,小编也在学习中,遇到大家都遇到的问题,底部导航。下面给大家贴出底部导航的编写,主要参考了lime这
- 本文实例讲述了Java Base64算法实际应用之邮件发送。分享给大家供大家参考,具体如下:一 利用telnet和Base64来实现收发邮件
- 前几天开发公司项目,有个地方要做一个分数的仪表盘,根据分数跑分,(设计的人估计是看到招商银行App的账号总览)网上好像找不到类似的组件,那就
- 前言:项目是c#的winform 写的,使用的播放器是基于AxWindowsMediaPlayer。AxWindowsMediaPlayer
- 前言前一段时间做了一个项目,需要解决中文、繁体、英文的国际化问题,所以本文将详细介绍springboot页面国际化配置的过程方法如下1.引入
- 包装类包装类其实就是8种基本数据类型对应的引用类型。基本数据类型引用数据类型byteByteshortShortintIntegerlong
- 本文实例讲述了Android TabLayout(选项卡布局)简单用法。分享给大家供大家参考,具体如下:我们在应用viewpager的时候,
- 一、项目简述本系统功能包括:分为前端翻后端部分,包括用户,区分晋通用户以及誉里员用户,包括首页展示,部门管理,人事管理,员工管理三个模块等等
- 自从接触javascript以来,对this参数的理解一直是模棱两可。虽有过深入去理解,但却也总感觉是那种浮于表面,没有完全理清头绪。但对于
- 本文实例总结了Android开发中的简单设置技巧。分享给大家供大家参考,具体如下:1开机图片:android-logo-mask.pngan
- 本文实例为大家分享了java实现简单石头剪刀布游戏的具体代码,供大家参考,具体内容如下问题描述Alice, Bob和Cindy一起玩猜拳的游
- 本文实现Unity调用手机摄像,拍摄,然后识别二维码,显示二维码的内容。需要导入一个zxing.unity.dll文件,现在这个脚本的识别数
- 如果项目中要用到数据库,铁定要用到分页排序。之前在做数据库查询优化的时候,通宵写了以下代码,来拼接分页排序的SQL语句 /// <su
- 在项目中用到了MapStruct,对其可以转换JavaBean特别好奇,因为之前都是使用Vo的方式手动set转换,但是接触到MapStruc
- 好问题。答案就是这篇文章的题目所建议的,这是一种合理的设计。在这种情况下,newInstance()方法是一种“静态工厂方法",让
- C#的MVC寻找对应的控制器首先是寻找当前域的如果找不到就会寻找备用的..但是有些时候我们是不想他去寻找备用的控制器.这里就涉及到了一个Da
- 11.可以使用抽象函数重写基类中的虚函数吗? 答: 可以 需使用 new 修饰符显式声明,表示隐藏了基类中该函数的实现
- (1)不需要传递参数,也不需要返回参数ThreadStart是一个委托,这个委托的定义为void ThreadStart(),没有参数与返回