程序如何尝试同时锁定多个互斥锁,并知道它最终解锁了哪个互斥锁。基本上,我正在寻找相当于select()
但对于互斥锁。这样的事情存在吗?如果没有,是否有任何库实现它?
答案 0 :(得分:0)
我(几乎)确定这种功能应该用监视器(以及使用信号/等待/广播的条件变量)来实现,但我认为你可以用一个额外的信号量来解决你的问题。
假设所有互斥锁对象都处于“锁定”状态,请创建一个初始值为0的信号量。每当互斥锁对象解锁时,递增(V)信号量。然后,像这样实施select()
:
// grab a mutex if possilbe
Mutex select(Semaphore s, Mutex[] m) {
P(s); // wait for the semaphore
for (Mutex toTry : m) {
boolean result = try_unlock(m);
if (result) return m;
}
}
本质上,信号量跟踪可用锁的数量,因此每当P(s)停止阻塞时,必须至少有一个可用的互斥锁(假设在互斥锁可用时正确递增信号量!)
我没有试图证明这个代码是正确的,也没有对它进行过测试......但我认为没有任何理由说它不起作用。
再一次,您可能想要使用显示器!