互斥是一种编程概念,经常用于解决多线程问题。我对社区的问题是:

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


当前回答

互斥锁在需要跨多个进程强制独占访问某个资源的情况下非常有用,而常规锁则没有帮助,因为它只能跨线程工作。

其他回答

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

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

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

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

互斥。这是维基百科上的词条。

互斥锁的作用是同步两个线程。当有两个线程试图访问一个资源时,一般的模式是让第一个代码块在进入代码之前尝试访问设置互斥量。当第二个代码块尝试访问时,它看到互斥锁已设置,并等待到第一个代码块完成(并取消互斥锁),然后继续。

如何实现这一点的具体细节显然因编程语言的不同而有很大差异。

互斥锁在需要跨多个进程强制独占访问某个资源的情况下非常有用,而常规锁则没有帮助,因为它只能跨线程工作。

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

考虑一下带钥匙的单人厕所。当有人进来时,他们拿着钥匙,厕所就有人了。如果有人要上厕所,他们需要排队。上完厕所的人把钥匙交给下一个排队的人。说得通,对吧?

将故事中的厕所转换为共享资源和互斥锁的密钥。带上厕所的钥匙(买一把锁)你就可以使用它了。如果没有钥匙(锁上了),你就得等。当钥匙被人归还(打开锁)时,你现在就可以自由地获得它了。

互斥:互斥是互斥的意思。这意味着在给定的时间内,只有一个进程/线程可以进入临界区。在并发编程中,多个线程/进程更新共享资源(任何变量,共享内存等)可能会导致一些意想不到的结果。(因为结果取决于哪个线程/进程获得了第一次访问)。

为了避免这种意想不到的结果,我们需要一些同步机制,以确保一次只有一个线程/进程可以访问这样的资源。

pthread库提供了对Mutex的支持。

typedef union
{
  struct __pthread_mutex_s
  {
    ***int __lock;***
    unsigned int __count;
    int __owner;
#ifdef __x86_64__
    unsigned int __nusers;
#endif
int __kind;
#ifdef __x86_64__
    short __spins;
    short __elision;
    __pthread_list_t __list;
# define __PTHREAD_MUTEX_HAVE_PREV      1
# define __PTHREAD_SPINS             0, 0
#else
    unsigned int __nusers;
    __extension__ union
    {
      struct
      {
        short __espins;
        short __elision;
# define __spins __elision_data.__espins
# define __elision __elision_data.__elision
# define __PTHREAD_SPINS         { 0, 0 }
      } __elision_data;
      __pthread_slist_t __list;
    };
#endif

这是互斥锁数据类型的结构,即pthread_mutex_t。 当互斥锁被锁定时,__lock设置为1。当它被解锁时,__lock设置为0。

这确保没有两个进程/线程可以同时访问临界区。