c# mutex互斥量的深入解析

 更新时间:2014年01月23日 08:55:19   作者:  
本篇文章主要是对c#中的mutex互斥量进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助

互斥锁(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#实现大数字运算的实例代码

    C#实现大数字运算的实例代码

    这篇文章介绍了C#实现大数字运算的实例代码,有需要的朋友可以参考一下
    2013-10-10
  • C# Newtonsoft.Json用法详解

    C# Newtonsoft.Json用法详解

    本文主要介绍了C# Newtonsoft.Json用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C#中List用法介绍详解

    C#中List用法介绍详解

    本文详细讲解了C#中List用法介绍,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C# 多线程更新界面的错误的解决方法

    C# 多线程更新界面的错误的解决方法

    这篇文章主要介绍了C# 多线程更新界面的错误方法,由于一个线程的程序,如果调用一个功能是阻塞的,那么就会影响到界面的更新,导致使用人员操作不便。所以往往会引入双线程的工作的方式,主线程负责更新界面和调度,而次线程负责做一些阻塞的工作,便有了下面春雨里方法
    2021-10-10
  • C# 线程切换后上下文都去了哪里(.NET高级调试分析)

    C# 线程切换后上下文都去了哪里(.NET高级调试分析)

    总会有一些朋友问一个问题,在 Windows 中线程做了上下文切换,请问被切的线程他的寄存器上下文都去了哪里?这个问题其实比较底层,如果对操作系统没有个体系层面的理解以及做过源码分析,其实很难说明白,这篇我们就从.NET高级调试的角度分析,需要的朋友可以参考下
    2023-12-12
  • C#实现XML文件操作详解

    C#实现XML文件操作详解

    这篇文章主要为大家详细介绍了如何利用C#实现XML操作文件,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C# 实现Table的Merge,Copy和Clone

    C# 实现Table的Merge,Copy和Clone

    这篇文章主要介绍了C# 实现Table的Merge,Copy和Clone,帮助大家更好的利用c#处理文件,感兴趣的朋友可以了解下
    2020-12-12
  • C#生成带二维码的专属微信公众号推广海报实例代码

    C#生成带二维码的专属微信公众号推广海报实例代码

    这篇文章主要给大家介绍了关于利用C#如何生成带二维码的专属微信公众号推广海报的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们一起来看看吧
    2018-12-12
  • C#之关于Base64简单加密与解密方式

    C#之关于Base64简单加密与解密方式

    这篇文章主要介绍了C#之关于Base64简单加密与解密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • C#使用DevExpress中的SplashScreenManager控件实现启动闪屏和等待信息窗口

    C#使用DevExpress中的SplashScreenManager控件实现启动闪屏和等待信息窗口

    这篇文章介绍了C#使用DevExpress中的SplashScreenManager控件实现启动闪屏和等待信息窗口的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论