欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c# mutex互斥量的深入解析

程序员文章站 2024-02-25 18:08:33
互斥锁(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是在系统中是唯一的。