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

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


当前回答

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

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

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

其他回答

互斥锁是一个互斥标志。它充当了一段代码的门卫,允许一个线程进入,并阻止对所有其他线程的访问。这样可以确保被控制的代码一次只被一个线程访问。只要确保在完成后释放互斥锁即可。:)

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

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

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

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

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

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

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。

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

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

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

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