一个互斥锁只能被等待它的线程释放?

4

互斥锁只能被等待该锁的线程释放,这是真的吗?如果是,为什么互斥锁会表现出这种行为?那为什么我们说互斥锁可以跨多个进程工作?什么是命名互斥锁和匿名互斥锁?我对这个问题感到非常困惑!

如果我想在一个线程中等待互斥锁,并从另一个线程发出信号,我该怎么做?


你是指 Mutex 类吗?需要明确一点,因为互斥锁是一个通用的概念,而 System.Threading.Mutex 是其具体实例。文档提供了使用说明,请参见:http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx 此外,有关 C# 中条件变量的更多信息,请参见此问题:https://dev59.com/VXI-5IYBdhLWcg3wKVE9 - Steve Townsend
4个回答

8
一个互斥信号量必须由获取它的同一线程释放。这是它们的工作方式:单个线程获取资源上的锁以便操作它,然后在完成后释放该锁以使其他线程可以锁定它。
“互斥”位的整个重点在于拥有锁的线程具有完全的控制权——只有它才能释放该锁。这仍然允许互斥体在多个线程之间工作,因为它可以在其生命周期内被任何一个线程所拥有。
命名互斥体还允许单个互斥体在进程和线程之间工作。名称用于允许单独的进程“连接”到已创建的互斥体,并且它可以用于跨所有连接的进程控制对资源的访问。
对于像您期望的跨线程通信,您需要查看类似于条件变量的东西,它用于向线程发出信号表示已满足某种条件——我认为.NET中的等待和脉冲方法的等效物是Monitor。

“互斥”位的整个意义在于拥有锁的线程具有绝对的控制权 - 只有它才能释放该锁。请参见此处,“这个算法要求一个线程获取的互斥锁可以被另一个线程释放。”你是在说这篇文章的作者不称职吗?;) - Andrew Savinykh
@Andrew,并不是无能,只是在术语上有些懒散。如果允许一个互斥锁被不同的线程解锁,它就失去了保护共享资源的能力。互斥(Mutual exclusion)的意思就是:这个资源是我的,走开,你不能使用它,直到我用完为止。可能会有一些同步原语可以允许外部方代表你释放,但我认为它们不应该被称为互斥锁,而应该是mut<非常请愿,只有在确实知道自己在做什么时才使用> :-) - paxdiablo

1

互斥锁具有所有权 - 请参阅paxdiablo的帖子。如果您想在一个线程中等待某些东西并从另一个线程发出信号,请不要使用互斥锁!事件-OK,条件变量-OK,监视器-OK,信号量-OK,事件-OK,互斥锁-不OK。

敬礼, 马丁


1

你不能从任何其他线程发出互斥信号(= Mut-ual Ex-clusion内核同步构造),除非是获取它的那个线程。


0

简短的回答是,当互斥锁被释放(由拥有线程)时,其他线程将被通知。

也就是说,所有等待互斥锁的线程将竞争互斥锁的所有权,获胜者将从等待调用中返回并继续执行,拥有互斥锁的所有权。

这就是使用互斥锁与自己协调信号之间的区别。我的回答是否解决了你的问题,或者我误解了你的问题?

敬礼 丹尼尔


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接