Multithreading 什么是互斥?

Multithreading 什么是互斥?,multithreading,concurrency,mutex,Multithreading,Concurrency,Mutex,互斥锁是一种编程概念,经常用于解决多线程问题。我向社会提出的问题是: 什么是互斥体以及如何使用互斥体?当您使用多线程应用程序时,不同的线程有时共享一个公共资源,例如变量或类似资源。这个共享源通常不能同时访问,因此需要一个构造来确保一次只有一个线程在使用该资源 这个概念被称为“互斥”(短互斥),是一种确保在该区域内只允许一个线程使用该资源等的方法 如何使用它们是特定于语言的,但通常(如果不总是)基于操作系统互斥 由于范式的原因,有些语言不需要这种构造,例如函数式编程(Haskell,ML就是很好的

互斥锁是一种编程概念,经常用于解决多线程问题。我向社会提出的问题是:


什么是互斥体以及如何使用互斥体?

当您使用多线程应用程序时,不同的线程有时共享一个公共资源,例如变量或类似资源。这个共享源通常不能同时访问,因此需要一个构造来确保一次只有一个线程在使用该资源

这个概念被称为“互斥”(短互斥),是一种确保在该区域内只允许一个线程使用该资源等的方法

如何使用它们是特定于语言的,但通常(如果不总是)基于操作系统互斥


由于范式的原因,有些语言不需要这种构造,例如函数式编程(Haskell,ML就是很好的例子)。

MutualExclusion

互斥锁的要点是同步两个线程。当您有两个线程试图访问单个资源时,通常的模式是让第一个试图访问的代码块在输入代码之前设置互斥锁。当第二个代码块尝试访问时,它会看到设置了互斥锁,并等待第一个代码块完成(并取消设置互斥锁),然后继续


关于如何实现这一点的具体细节显然因编程语言而异。

互斥体是一个相互排斥的标志。它充当一段代码的看门人,允许一个线程进入并阻止对所有其他线程的访问。这确保了被控制的代码一次只能被一个线程命中。完成后,请确保释放互斥锁。:)

当我在工作中进行一场激烈的讨论时,我会用一只橡皮鸡,我会把它放在桌子上,以备不时之需。拿着鸡的人是唯一被允许说话的人。如果你不拿着鸡,你就不能说话。你只能表示你想要鸡肉,等你拿到它再说话。演讲结束后,你可以把鸡交还给主持人,主持人会把鸡交给下一个要发言的人。这确保了人们不会互相争吵,也有自己的谈话空间

用互斥替换鸡肉,用线程替换人,基本上你就有了互斥的概念


当然,没有橡胶互斥体这样的东西。只有橡胶鸡。我的猫曾经有一只橡皮老鼠,但他们把它吃掉了

当然,在你使用橡皮鸡之前,你需要问问自己,你是否真的需要5个人在一个房间里,一个人在房间里独自做所有的工作会不会更容易。实际上,这只是扩展了类比,但你明白了。

在C#中,常用的互斥体是。类型为“”。它也可以通过“”语句隐式使用。它的一个使用示例是在构造单例类时

private static readonly Object instanceLock=new Object();
私有静态MySingleton实例;
公共静态MySingleton实例
{
锁(instanceLock)
{
if(实例==null)
{
instance=new MySingleton();
}
返回实例;
}
}
使用private lock对象的lock语句创建一个临界段。要求每个线程等待上一个线程完成。第一个线程将进入节并初始化实例。第二个线程将等待,进入节,并获取初始化的实例


任何类型的静态成员同步都可以使用类似的lock语句。

在需要强制对跨多个进程访问的资源进行独占访问的情况下,互斥锁非常有用,因为常规锁只在跨线程时起作用。

要想理解互斥锁,首先需要知道什么是互斥锁“竞赛条件“然后,只有您才能理解为什么需要互斥。假设您有一个多线程程序,并且有两个线程。现在,作业队列中有一个作业。第一个线程将检查作业队列,找到作业后,它将开始执行作业队列。第二个线程还将检查作业队列,并发现队列中有一个作业。因此,它还将分配相同的作业指针。那么,现在发生了什么,两个线程都在执行同一个作业。这将导致分段错误。这是竞争条件的示例

这个问题的解决方案是互斥。互斥锁是一种一次锁定一个线程的锁。如果另一个线程想要锁定它,该线程就会被阻塞


互斥主题链接非常值得一读。

这里有一些很好的答案,下面是另一个很好的类比,用来解释什么是互斥:

考虑带钥匙的单人厕所。当有人进来时,他们拿走了钥匙,厕所就被占用了。如果其他人需要上厕所,他们需要排队等候。当厕所里的人用完后,他们把钥匙递给排队的下一个人。有道理,对吧

将故事中的马桶转换为共享资源,将密钥转换为互斥锁。带上厕所的钥匙(获得锁)就可以使用它。如果没有钥匙(锁已锁上),您必须等待。当某人归还钥匙(释放锁)时,您现在可以自由获取钥匙。

什么是钥匙?

互斥(实际上,互斥是互斥的缩写)也称为自旋锁(spinlock),是最简单的同步工具,用于保护关键区域,从而防止竞争条件。也就是说,线程必须在进入临界区之前获得锁(在临界区中,多个线程共享一个公共变量、更新一个表、写入一个文件等等),它在离开临界区时释放锁

什么是a?