互斥是一种编程概念,经常用于解决多线程问题。我对社区的问题是:
什么是互斥锁,如何使用它?
互斥是一种编程概念,经常用于解决多线程问题。我对社区的问题是:
什么是互斥锁,如何使用它?
当前回答
互斥锁在需要跨多个进程强制独占访问某个资源的情况下非常有用,而常规锁则没有帮助,因为它只能跨线程工作。
其他回答
当您有一个多线程应用程序时,不同的线程有时会共享一个公共资源,例如变量或类似的资源。这个共享源通常不能同时访问,因此需要一个构造来确保一次只有一个线程在使用该资源。
这个概念被称为“互斥”(简称互斥),是一种确保只有一个线程被允许在该区域内使用该资源等的方法。
如何使用它们是特定于语言的,但通常(如果不是总是)基于操作系统互斥。
由于范式的原因,一些语言不需要这个构造,例如函数式编程(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。
这确保没有两个进程/线程可以同时访问临界区。