zoukankan      html  css  js  c++  java
  • 互斥锁(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;
    
    namespace ConsoleAppMutex
    {
        class Program
        {
            /// <summary>
            /// 单实例执行测试
            /// </summary>
            /// <param name="args"></param>
            [STAThread] //指示应用程序的Com线程模型是单线程单元(STA)
            static void Main(string[] args)
            {
                string name = "Test";
                
                /**
                 * 测试1
                 * */
    
                bool flag = false;
                //第一个参数:true--给调用线程赋予互斥体的初始所属权
                //第一个参数:互斥体的名称
                //第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true
                System.Threading.Mutex mutex = new System.Threading.Mutex(true, name, out flag);
    
                if (flag)
                {
                    Console.Write("Running");
                }
                else
                {
                    Console.Write("Another is Running");
                    System.Threading.Thread.Sleep(5000);//线程挂起5秒钟
                    Environment.Exit(1);//退出程序
                }
                Console.ReadLine();
    
                /**
                * 测试2
                * */
    
                //创建单实例对象
                //System.Threading.Mutex mutex2 = new System.Threading.Mutex(false, name);
    
                //if (!mutex2.WaitOne(10, false)) //做单实例检测
                //{
                //    Console.Write("Another is Running");
                //    System.Threading.Thread.Sleep(5000);//线程挂起5秒钟
                //    Environment.Exit(1);//退出程序
                //}
                //else
                //{
                //    Console.Write("Running");
                //}
                //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是在系统中是唯一的。

  • 相关阅读:
    leetcode778
    2020年的一些总结
    go笔记 NSQ (6) ( nsqd如何创建消费者以及消费消息)
    go笔记 NSQ (5) ( nsqd如何监听生产者的消息,select关键字使用)
    go笔记 NSQ (4) ( nsqd启动监听来了解go如何编写tcp与http服务端,以及sync.WaitGroup线程同步工具使用 )
    go笔记 NSQ (3) ( 从启动nsqd了解flag包使用,解析配置文件以及json有关,反射使用 )
    Sitecore去除地址中带语言,例:localhost:8080/zh-cn/index
    js给URL追加参数
    SQL Server服务启动时错误:1069(由于登陆失败而无法启动服务)
    C# windows服务定时处理/例每天凌晨1点处理数据
  • 原文地址:https://www.cnblogs.com/gsk99/p/5006787.html
Copyright © 2011-2022 走看看