当前位置:  开发笔记 > 编程语言 > 正文

什么是互斥?

如何解决《什么是互斥?》经验,为你挑选了9个好方法。

互斥体是一种经常用于解决多线程问题的编程概念.我向社区提出的问题:

什么是互斥锁,你如何使用它?



1> Xetius..:

当我在工作中进行激烈的讨论时,我会使用一只橡皮鸡,我会把它留在我的办公桌上.持鸡的人是唯一被允许说话的人.如果你不抓鸡,你就不会说话.你只能表明你想要鸡肉并等到你说话之前就得到它.讲完后,你可以把鸡还给主持人,主持人会把它交给下一个发言的人.这可以确保人们不会互相交谈,也有自己的谈话空间.

用Mutex替换鸡和有线程的人,你基本上有互斥的概念.

当然,没有橡皮互补器这样的东西.只有橡皮鸡.我的猫曾经有过橡皮鼠,但他们吃了它.

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


鸡是_mutex_.人们将mu ..鸡肉比作_竞争线程_.主持人是_OS_.当人们要求鸡肉时,他们会提出锁定请求.当你调用mutex.lock()时,你的线程在lock()中停止并向操作系统发出锁定请求.当操作系统检测到互斥锁从某个线程释放时,它只会将其发送给您,并且lock()返回 - 互斥锁现在是您的,只有您自己的.没有其他人可以窃取它,因为调用lock()会阻止他.还有try_lock(),当mutex属于你时会阻塞并返回true,如果正在使用互斥锁,则会立即返回false.
有时一些编程概念的起源尚不清楚.一个新手可能会想知道为什么每个人都在谈论正则表达式.正则表达式是[reg] ular [ex]压力的缩写.类似地,互斥量是[mut] ual [ex] clusion的缩写.这可能使该术语的含义更容易消化.@TheSmurf在他们的答案中与它相关联,但是为了历史目的将它添加到这里可能是好的.
很好的答案.难道有人认为Mutex实际上是阻止鸡肉通过的规则吗?而鸡是你锁定的东西?
你是个天才.你能用橡皮鸡比喻来解释监视器吗?
@SirYakalot,你的意思是鸡是资源,主持人是互斥体?

2> Craig..:

互斥是一种互斥的旗帜.它充当一段代码的守门员,允许一个线程进入并阻止访问所有其他线程.这可以确保所控制的代码一次只能被一个线程命中.确保在完成后释放互斥锁.:)


互斥锁本身与代码段无关,它可以保护一些*资源.*如果互斥锁只在该代码周围使用,那么该资源可能是一个代码段,但是,你开始在多个地方使用互斥锁的那一分钟在您的代码中,您的解释失败了.通常,它还可以用于保护某些数据结构,这些数据结构可以从代码中的许多位置访问.

3> TheSmurf..:

相互排斥.这是维基百科上的条目:

http://en.wikipedia.org/wiki/Mutual_exclusion

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

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



4> Mats Fredrik..:

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

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

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

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

现在,去问google如何使用它们!:)



5> Anthony Mast..:

在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语句.



6> habib..:

什么是互斥体?

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

什么是比赛条件?

当两个或多个线程可以访问共享数据并且他们尝试同时更改它时,会发生竞争条件.因为线程调度算法可以在任何时间在线程之间交换,所以您不知道线程将尝试访问共享数据的顺序.因此,数据变化的结果取决于线程调度算法,即两个线程都"竞相"访问/改变数据.

真人生活的例子:

当我在工作中进行激烈的讨论时,我会使用一只橡皮鸡,我会把它留在我的办公桌上.持鸡的人是唯一被允许说话的人.如果你不抓鸡,你就不会说话.你只能表明你想要鸡肉并等到你说话之前就得到它.讲完后,你可以把鸡还给主持人,主持人会把它交给下一个发言的人.这可以确保人们不会互相交谈,也有自己的谈话空间.

用Mutex替换鸡和有线程的人,你基本上有互斥的概念.

@Xetius

在C#中的用法:

此示例显示如何使用本地Mutex对象来同步对受保护资源的访问.因为每个调用线程在获取互斥锁的所有权之前都被阻塞,所以它必须调用ReleaseMutex方法来释放线程的所有权.

using System;
using System.Threading;

class Example
{
    // Create a new Mutex. The creating thread does not own the mutex.
    private static Mutex mut = new Mutex();
    private const int numIterations = 1;
    private const int numThreads = 3;

    static void Main()
    {
        // Create the threads that will use the protected resource.
        for(int i = 0; i < numThreads; i++)
        {
            Thread newThread = new Thread(new ThreadStart(ThreadProc));
            newThread.Name = String.Format("Thread{0}", i + 1);
            newThread.Start();
        }

        // The main thread exits, but the application continues to
        // run until all foreground threads have exited.
    }

    private static void ThreadProc()
    {
        for(int i = 0; i < numIterations; i++)
        {
            UseResource();
        }
    }

    // This method represents a resource that must be synchronized
    // so that only one thread at a time can enter.
    private static void UseResource()
    {
        // Wait until it is safe to enter.
        Console.WriteLine("{0} is requesting the mutex", 
                          Thread.CurrentThread.Name);
        mut.WaitOne();

        Console.WriteLine("{0} has entered the protected area", 
                          Thread.CurrentThread.Name);

        // Place code to access non-reentrant resources here.

        // Simulate some work.
        Thread.Sleep(500);

        Console.WriteLine("{0} is leaving the protected area", 
            Thread.CurrentThread.Name);

        // Release the Mutex.
        mut.ReleaseMutex();
        Console.WriteLine("{0} has released the mutex", 
            Thread.CurrentThread.Name);
    }
}
// The example displays output like the following:
//       Thread1 is requesting the mutex
//       Thread2 is requesting the mutex
//       Thread1 has entered the protected area
//       Thread3 is requesting the mutex
//       Thread1 is leaving the protected area
//       Thread1 has released the mutex
//       Thread3 has entered the protected area
//       Thread3 is leaving the protected area
//       Thread3 has released the mutex
//       Thread2 has entered the protected area
//       Thread2 is leaving the protected area
//       Thread2 has released the mutex

MSDN参考互斥锁



7> Chen A...:

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

考虑带钥匙的单人厕所.当有人进入时,他们拿钥匙,厕所被占用.如果其他人需要使用厕所,他们需要排队等候.当厕所里的人完成后,他们将钥匙交给排队的下一个人.有道理,对吧?

转换的厕所在故事的共享资源,以及关键互斥体.将钥匙带到马桶上(获得锁)允许您使用它.如果没有钥匙(锁被锁定),你必须等待.当人员返回钥匙(释放锁)时,您现在可以自由获取钥匙.



8> user3751012..:

要了解MUTEX,首先需要知道什么是"竞争条件",然后才会理解为什么需要MUTEX.假设您有一个多线程程序,并且您有两个线程.现在,您在作业队列中有一个作业.第一个线程将检查作业队列,在找到作业后,它将开始执行它.第二个线程还将检查作业队列,并发现队列中有一个作业.因此,它也将分配相同的作业指针.所以,现在发生了什么,两个线程都在执行相同的工作.这将导致分段错误.这是竞争条件的一个例子.

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

这个pdf文件链接中的MUTEX主题非常值得一读.


好吧,Mutex只是一个价值1的信号量

9> 18hrs..:

在需要对多个进程中的资源强制执行独占访问的情况下,互斥锁非常有用,常规锁定无法帮助,因为它只能在线程上运行.

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有