一个互斥锁真的只能从等待那个互斥锁的线程中释放吗?如果是,为什么互斥是这样的?那么为什么我们说一个互斥锁可以跨多个进程工作呢?什么是命名互斥锁和未命名互斥锁?我对这个问题真的很困惑!
如果我想在一个线程中等待互斥锁,并从另一个线程发信号给它,我应该怎么做?
发布于 2011-06-13 15:05:50
互斥信号量必须由获得它的同一线程释放。这就是它们的工作方式:单个线程获取资源上的锁,以便它可以操作它,然后,当它完成操作时,它释放该锁,以便其他线程可以锁定它。
“互斥”位的全部意义在于,拥有锁的线程拥有总的能力--只有它才能释放锁。这仍然允许互斥锁跨多个线程工作,因为在其生命周期中,互斥锁可以归其中任何一个线程所有。
命名互斥锁允许单个互斥锁同时跨进程和线程工作。该名称用于允许单独的进程“连接”到已经创建的互斥锁,然后可以使用它来控制跨所有连接的进程对资源的访问。
对于您所期望的跨线程通信,您可以看到类似于条件变量的东西,它用于通知线程某个条件已经满足-我认为.Net中的等价物是监视器,它有Wait和Pulse方法。
发布于 2011-06-13 15:13:20
互斥锁拥有所有权-参见paxdiablo post。如果你想等待一个线程中的某个东西,并从另一个线程发出信号,那么不要使用互斥!Event- OK,condvar-OK,monitor-OK,semaphore-OK,Event - OK,mutex-not OK。
Rgds,Martin
发布于 2011-06-13 18:14:41
除了获取互斥锁的线程之外,不能从任何其他线程发出互斥锁(= Mut-ual Ex-clusion内核同步构造)的信号。
https://stackoverflow.com/questions/6327436
复制相似问题