什么是互斥量?
互斥量是一种常用于解决multithreading问题的编程概念。 我对社区的问题:
什么是互斥量,你如何使用它?
当我在工作中有一个激烈的讨论时,我会用橡皮鸡,这种情况下,我会把它放在桌子上。 拿鸡的人是唯一可以谈话的人。 如果你不抱鸡,你就不会说话。 你只能表明你想要这只鸡,等到你吃完之后再说。 一旦你说完了,你可以把鸡肉交给主持人,他们会把它交给下一个人说话。 这样可以保证人们不会互相讲话,也有自己的空间来交谈。
replace鸡与互斥体和线程的人,你基本上有一个互斥体的概念。
当然,没有像橡胶互斥体那样的东西。 只有橡皮鸡。 我的猫曾经有一只橡皮鼠标,但他们吃了它。
当然,在你使用橡皮鸡之前,你需要问自己,你是否真的需要5个人在一个房间里,一个人独自一人在房间里做所有的工作。 其实,这只是扩大比喻,但你明白了。
互斥体是一个互斥的标志。 它作为守门员的一段代码,允许一个线程进入并阻止访问所有其他线程。 这确保了被控制的代码一次只能被一个线程所触发。 只要确保在完成时释放互斥锁。 🙂
相互排斥。 这里是维基百科条目:
http://en.wikipedia.org/wiki/Mutual_exclusion
互斥体的一点是同步两个线程。 当你有两个线程试图访问单个资源时,一般的模式是在input代码之前先让第一块代码尝试访问来设置互斥体。 当第二个代码块尝试访问时,它看到互斥体被设置并等待,直到第一个代码块完成(并且取消设置互斥体),然后继续。
编程语言的具体细节明显不同。
当你有一个multithreading的应用程序,不同的线程有时共享一个共同的资源,如variables或类似的。 这个共享源通常不能同时被访问,所以需要一个构造来确保一次只有一个线程正在使用这个资源。
这个概念被称为“互斥”(short Mutex),并且是一种确保在该区域内只允许使用该资源的一个线程的方法。
如何使用它们是语言特定的,但通常(如果不是总是)基于操作系统互斥体。
有些语言不需要这个构造,由于范例,例如函数式编程(Haskell,ML就是很好的例子)。
现在,去问问谷歌如何使用它们! 🙂
在C#中,常用的互斥量是Monitor 。 types是“ System.Threading.Monitor ”。 它也可以通过' lock(Object) '语句隐式使用。 使用它的一个例子是构build一个Singleton类。
private static readonly Object instanceLock = new Object(); private static MySingleton instance; public static MySingleton Instance { lock(instanceLock) { if(instance == null) { instance = new MySingleton(); } return instance; } }
使用专用locking对象的locking语句将创build临界区域。 要求每个线程等待,直到前一个完成。 第一个线程将进入该部分并初始化该实例。 第二个线程将等待,进入该部分,并获得初始化的实例。
静态成员的任何types的同步可以类似地使用locking语句。
在需要强制跨多个进程的资源的独占访问的情况下,互斥锁非常有用,在这种情况下,常规locking将不起作用,因为它只能跨线程工作。
首先要了解MUTEX,你需要知道什么是“竞争条件”,然后只有你才会明白为什么需要MUTEX。 假设你有一个multithreading程序,并且你有两个线程。 现在,你在工作队列中有一份工作。 第一个线程将检查作业队列,并在find作业后开始执行作业。 第二个线程也将检查作业队列,并发现队列中有一个作业。 所以,它也会分配相同的作业指针。 所以,现在发生了什么,两个线程正在执行相同的工作。 这将导致分段错误。 这是一个竞争条件的例子。
解决这个问题的方法是MUTEX。 MUTEX是一种一次locking一条线的锁。 如果另一个线程想要locking它,线程就会被阻塞。
这个pdf文件链接中的MUTEX主题非常值得一读。
这里有一些很好的答案,下面是解释互斥体是什么的另一个很好的比喻:
考虑一个关键的 单个厕所。 当有人进入时,他们把钥匙和厕所占用 。 如果其他人需要使用厕所,他们需要排队等候 。 当厕所里的人完成时 ,他们把钥匙交给下一个排队的人。 有道理,对吧?
将故事中的马桶转换为共享资源 ,并将其转换为互斥锁 。 把钥匙拿到洗手间(获得一个锁)允许你使用它。 如果没有钥匙(锁被locking),你必须等待。 当人员返回钥匙( 释放locking )时,您可以自由获取钥匙 。