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是在系统中是唯一的。

标签:c#,mutex,互斥量
0
投稿

猜你喜欢

  • Java实现图片倒影的源码实例内容

    2022-08-30 02:39:24
  • C# 中用 Sqlparameter 的两种用法

    2022-11-19 03:52:52
  • java8从list集合中取出某一属性的值的集合案例

    2023-04-30 01:51:49
  • 读取Java文件到byte数组的三种方法(总结)

    2023-08-01 17:19:39
  • java中main函数你知道多少

    2023-05-26 12:32:15
  • 简述Java图像倾斜方法及实例 <font color=red>原创</font>

    2023-08-16 09:38:47
  • 浅谈Java转义符\\\\|

    2022-12-11 16:25:43
  • JAVA内部类示例详解及练习

    2023-04-05 06:42:39
  • Java根据ip地址获取归属地实例详解

    2023-11-25 06:24:38
  • Java Socket实现传输压缩对象的方法示例

    2022-12-18 06:52:30
  • SpringBoot 实现自定义的 @ConditionalOnXXX 注解示例详解

    2023-04-04 03:37:18
  • Java用邻接矩阵存储图的示例代码

    2021-10-05 21:39:18
  • Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】

    2023-03-17 11:09:11
  • c# 几个常见的TAP异步操作

    2021-11-09 21:33:36
  • Java毕业设计实战之在线网盘系统的实现

    2023-03-05 05:42:47
  • kotlin java 混合代码 maven 打包实现

    2023-04-09 13:33:41
  • java实现上传文件类型检测过程解析

    2023-11-09 12:04:21
  • JAVA递归生成树形菜单的实现过程

    2023-07-15 08:57:22
  • java实现输入输出流代码分享

    2023-11-18 01:03:45
  • java动态绑定和静态绑定用法实例详解

    2022-04-17 19:55:20
  • asp之家 软件编程 m.aspxhome.com