【问题标题】:A mutex can only be released from the same thread that waited on it?互斥锁只能从等待它的同一线程中释放吗?
【发布时间】:2011-06-13 06:59:03
【问题描述】:

是否只能从等待该互斥锁的线程中释放互斥锁?如果是,为什么互斥锁会这样?那么为什么我们说互斥锁可以跨多个进程工作呢?什么是命名互斥锁和未命名互斥锁?我真的很困惑这个问题!

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

【问题讨论】:

标签: c# multithreading mutex


【解决方案1】:

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

“互斥”位的全部意义在于拥有锁的线程拥有全部权力——只有它可以释放该锁。这仍然允许互斥锁跨多个线程工作,因为它可以在其生命周期内由其中任何一个线程拥有。

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

对于您想要的跨线程通信,您正在查看类似于条件变量的东西,它用于向线程发出信号表明条件已满足 - 我认为 .Net 中的等价物是监视器,它的等待和脉冲方法。

【讨论】:

  • “互斥”位的全部意义在于拥有锁的线程拥有全部权力——只有它可以释放那个锁参见here“这个 要求一个线程获取的互斥锁可以被另一个线程释放。”你是说这篇文章的作者不称职? ;)
  • @Andrew,不是无能,只是他们的术语松懈。如果你允许一个互斥锁被不同的线程解锁,它就失去了保护共享资源的能力。相互排斥的意思就是:这个资源是我的,走开,在我用完之前你不能拥有它。可能存在允许外部方代表您释放的同步原语,但我认为它们不应该被称为互斥体,而是mut<pretty please, only use if you really know what you're doing>s :-)
【解决方案2】:

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

Rgds, 马丁

【讨论】:

    【解决方案3】:

    除了获取它的线程之外,您不能从任何其他线程发出互斥锁(= Mut-ual Ex-clusion 内核同步结构)。

    【讨论】:

      【解决方案4】:

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

      即所有在互斥体上等待的线程都将争夺互斥体的所有权,获胜者将从等待调用返回并继续执行,获得互斥体的所有权。

      这就是使用互斥体与必须自己协调信号的区别。 这回答了你的问题还是我误解了你?

      BR 丹尼尔

      【讨论】:

        猜你喜欢
        • 2014-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 2011-03-17
        • 2015-03-21
        • 2010-12-07
        相关资源
        最近更新 更多