什么是互斥锁?
互斥锁是一种编程概念,经常用于解决多线程问题。我对社区的问题:
什么是互斥锁,如何使用?
解决方案
回答
当我们有一个多线程应用程序时,不同的线程有时会共享一个公共资源,例如变量或者类似资源。通常无法同时访问此共享源,因此需要一种构造来确保一次只有一个线程在使用该资源。
此概念称为"互斥"(互斥体的简称),是一种确保使用该资源等在该区域内仅允许一个线程的方式。
如何使用它们是特定于语言的,但是通常(如果不是始终)基于操作系统互斥量。
由于范式,某些语言不需要这种构造,例如函数式编程(Haskell,ML是很好的示例)。
现在,去问谷歌如何使用它们! :)
回答
互斥。这是其上的Wikipedia条目:
http://en.wikipedia.org/wiki/Mutual_exclusion
互斥锁的重点是同步两个线程。当我们有两个线程尝试访问单个资源时,通常的模式是在输入代码之前让第一段代码尝试访问以设置互斥量。当第二个代码块尝试访问时,它将看到互斥锁已设置,并等待直到第一个代码块完成(并取消设置互斥锁),然后继续。
如何实现此目标的具体细节显然因编程语言而有很大差异。
回答
互斥锁是互斥标志。它充当一段代码的网守,允许一个线程进入并阻止对所有其他线程的访问。这样可以确保被控制的代码一次只能被单个线程访问。只要确保完成后释放互斥量即可。 :)
回答
当我在工作中进行激烈讨论时,我会使用橡胶鸡,在这种情况下,我会把它放在书桌上。抱着鸡的人是唯一被允许说话的人。如果不握鸡,就不会说话。我们只能指出自己想要这只鸡,然后等到收到它再说。一旦说完,我们就可以将鸡肉交还给主持人,主持人将把鸡肉交给下一个要发言的人。这样可以确保人们不会互相讲话,也没有自己的交谈空间。
用Mutex替换Chicken并用线程替换person,我们基本上就有了互斥锁的概念。
当然,没有橡胶互斥锁。只有橡皮鸡。我的猫曾经有一只橡胶老鼠,但他们吃了它。
当然,在使用橡皮鸡之前,我们需要问自己是否在一个房间里实际上需要5个人,而让一个人独自完成所有工作不仅会更容易吗?实际上,这只是在扩展类比,但我们明白了。
回答
在C#中,常用的互斥锁是Monitor。类型为" System.Threading.Monitor"。也可以通过'lock(Object)'语句隐式使用它。使用它的一个例子是在构造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; } }
使用私有锁对象的lock语句创建一个关键部分。要求每个线程等待,直到前一个线程完成。第一个线程将进入该部分并初始化实例。第二个线程将等待,进入本节,并获取已初始化的实例。
静态成员的任何类型的同步都可以类似地使用lock语句。
回答
在需要跨多个进程强制对资源进行独占访问的情况下,互斥锁很有用,在这种情况下常规锁将无济于事,因为它只能跨线程工作。