关于C#的互斥

以下内容有错误请指正,为个人理解和经验。

c#提供三种互斥Monitor类、Lock和Mutex类,他们的区别和使用方法如下:

一、Lock类

名叫“临界区”,为Monitor的封装版,用于多线程,对单线程无用,即支持在同一个线程内多次调用lock锁定同一个目标。

用法

            lock (this) {
                //执行代码
            }

效果为在多个线程内调用同一个函数时,函数内部使用锁定方法,可以让线程进行“排队”等候,直到lock结束为止,然后其他函数才能排队进入下一个执行代码。

等待为无限等待,直到占用被释放,否则线程一直阻塞。

注意事项:不建议锁定Public对象(含this,typeof(Type),"字符串"),别和上面的例子一样使用this,强烈不推荐,因为如果lock了自己的同时,可能还存在外部有锁定该对象的可能,造成同一个对象被多个函数内部锁定,可能影响效率。建议如下使用

        private object obj = new object();
        public void Test()
        {
            lock (obj)
            {
                //执行代码
            }
        }

二、Monitor类

和Lock效果一致,使用方法不同

        private object obj = new object();
        public void Test()
        {
            if (System.Threading.Monitor.TryEnter(obj, 1000))//排队等待1秒
            {
                //执行代码
                System.Threading.Monitor.Exit(obj);//退出
            }
            else
            {
                //排队等不到,就不等了
            }
        }

可以看出,区别是增加了时间,也就是如果排队不耐烦了,可以不等了,而离开队伍,对此,System.Threading.Monitor还提供多个函数使用

Enter尝试获取一个对象,同时第二个可选参数返回是否获取成功

TryEnter尝试获取一个对象,并在第二个可选参数上设置尝试的等待时间

Wait释放获得的对象,并在第二个可选参数时间后再次尝试获取该对象(即排队到自己后,自己办理中途整理资料停一会,让给其他人办,然后继续办理)

Exit释放获得的对象,和Wait类似,但不阻塞当前线程,也不尝试再次获取该对象

Pulse(),PulseAll()向一个或多个等待线程发送信号,表示自己即将释放对象,请大家做好准备,一般在Exit或者Wait前调用,可提高性能。

三、Mutex类

名字叫互斥锁(互斥体,互斥量),可用于多线程,功能类似Monitor,但它主要的用途不是用于多线程,而是用于进程。

特点仍然是拥有执行权的线程可以多次拥有,但也必须多次释放。

使用方法

        private static System.Threading.Mutex mutex = null;//设置为static成员,是为了在整个程序生命周期内都持有Mutex
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            bool firstInstance;
            mutex = new System.Threading.Mutex(true, "name", out firstInstance);
            if (!firstInstance) {
                MessageBox.Show("存在");
                return;
            }
        }

主要为2个函数ReleaseMutex和WaitOne,前者是释放,后者是等待释放的信号。

上面的代码的构造函数的第一个参数就是是否立即获取,第二个参数是互斥体的名称,注意是全局的,可以不填为匿名,但如果填了就不能再创建同名的互斥体(包括不同的软件,所以建议使用程序名)。

时间: 2024-07-29 07:58:34

关于C#的互斥的相关文章

信号量 (线程互斥)

信号量:表示可用资源的数量,MUTEX是非0即为1的, 即,如果信号量描述的资源数目是1时,此时的信号量和互斥锁相同! 调用sem_wait()可以获得资源(P操作),使semaphore的值减1,如果调用sem_wait()时 semaphore的值已经是0,则挂起等待.如果不希望挂起等待,可以调用sem_trywait() .调用 sem_post() 可以释放资源(V操作),使semaphore 的值加1,同时唤醒挂起等待的线程. 1.生产者不会把消费者套个圈 2.消费者不会超过生产者  

秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题 在<秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量>中对经典多线程同步互斥问题进行了回顾和总结,这篇文章对Windows系统下常用的线程同步互斥机制——关键段.事件.互斥量.信号量进行了总结.有网友问到互斥量能处理“遗弃”问题,事件和信号量是否也能处理“遗弃”问题.因此本文将对事件和信号量作个试验,看看事件和信号量能否处理“遗弃”问题. 一.

【Java并发编程】之七:使用synchronized获取互斥锁的几点说明

 在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确保在某一时刻,方法内只允许有一个线程. 采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁.每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池.任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,

C++拾遗--多线程:临界区解决子线程的互斥

C++拾遗--多线程:临界区解决子线程的互斥 前言 为了解决子线程的互斥问题,windows系统提出了关键段或临界区(CRITICAL_SECTION)的概念.它一共有四个共两对操作:初始化.销毁,进入.离开.它们定义在头文件synchapi.h中. 1.初始化变量 VOID WINAPI InitializeCriticalSection( LPCRITICAL_SECTION lpCriticalSection ); 2.销毁变量 VOID WINAPI DeleteCriticalSect

linux 进程间同步互斥

参考链接: https://www.oschina.net/code/snippet_237505_8646 http://www.cnblogs.com/xilentz/archive/2012/11/13/2767317.html 互斥: http://blog.csdn.net/szkbsgy/article/details/50458641

31、互斥锁与进程间通信

我们之前做了多进程并发,那么你们有没有发现问题.如果说多个进程共享同一个数据,比如抢火车票大家同时在客户端查看同时购买会出现什么问题呢?今天我们将讲述进程锁还有进程间通信,进程之间彼此隔离,他们需要一个第三方联系起来. 一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行的修改,没错,速度是慢了,牺牲了速度而保证了数据安全. 1.上厕所 先举个通俗易懂

Freertos-事件标志组,消息队列,信号量,二值信号量,互斥信号量

任务间的通信和同步机制  在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后就是另一种情况了. 使用全局变量相比事件标志组主要有如下三个问题: 1.使用事件标志组可以让 RTOS 内核有效地管理任务,而全局变量是无法做到的,任务的超时等机制需要用户自己去实现.2.使用了全局变量就要防止多任务的访问冲突,而使用事件标志组则处理好了这个问题,用户无需担心.3.使用事件标志组可以有效地解决中断服务程序和任务之间的同步问题. 事件标志组:事件标志组是实现多任务同步的有效机制之一. 每创建一

Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取.ReentrantLock分为"公平锁"和"非公平锁".它们的区别体现在获取锁的机制上是否公平."锁"是为了保护竞争资源,防止多个线程同时操作线程而出错,ReentrantLock在

字符设备驱动程序之同步互斥阻塞

目的:在同一时刻,只有一个应用程序打开/dev/buttons 驱动程序: #include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/delay.h>#include <linux/irq.h>#include <asm/uaccess.h>#include &l

理解互斥量和信号量

互斥量(Mutex) 互斥量表现互斥现象的数据结构,也被当作二元信号灯.一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源. Mutex本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥.Mutex对象的值,只有0和1两个值.这两个值也分别代表了Mutex的两种状态.值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待:值为1,表示空闲状态,当前对象为空闲