互斥锁只能从等待它的同一个线程中释放出来?

时间:2011-06-13 06:59:04

标签: c# multithreading mutex

是否只能从等待该互斥锁的线程中释放互斥锁?如果是,为什么互斥体会像这样?那么为什么我们说互斥锁可以跨多个进程工作呢?什么是-mutex和unnamed-mutex?我对这个问题感到很困惑!

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

4 个答案:

答案 0 :(得分:6)

互斥信号量 必须由获得它的同一个线程释放。这就是它们的工作方式:单个线程获取资源上的锁,以便它可以操作它,然后,当它完成时,它会释放该锁,以便其他线程可以锁定它。

“互斥”位的重点是具有锁的线程具有总功率 - 只有它可以释放该锁。这仍然允许互斥体跨多个线程工作,因为它可以在其生命周期中由任何一个线程拥有。

命名互斥锁允许单个互斥锁也可以跨进程和线程工作。该名称用于允许单独的进程“连接”到已创建的互斥锁,然后可以用它来控制跨所有连接进程的资源访问。

对于你想要的跨线程通信,你会看到类似于条件变量的东西,它用于向线程发出已满足条件的信号 - 我认为.Net中的等价物是Monitor,它的等待和脉冲方法。

答案 1 :(得分:1)

您无法从获取互斥锁的任何其他线程发出互斥锁(= Mut -ual Ex -clusion内核同步构造)的信号。

答案 2 :(得分:0)

互斥锁拥有所有权 - 请参阅paxdiablo帖子。如果你想等待线程中的某些东西并从另一个线程发出信号,请不要使用互斥锁!事件 - 好的,condvar-OK,monitor-OK,semaphore-OK,Event-OK,mutex-not OK。

RGDS, 马丁

答案 3 :(得分:0)

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

即。在互斥锁上等待的所有线程都将竞争互斥锁的所有权,并且胜利者将从等待调用返回并继续执行互斥锁的所有权。

使用互斥锁不必自己协调信号。 这回答你的问题或我误解了你吗?

BR 丹尼尔