程序如何尝试同时锁定多个互斥锁,并知道它最终解锁了哪个互斥锁。本质上,我正在寻找的是select()
互斥锁的等价物。这样的事情存在吗?如果没有,是否有任何实现它的库?
问问题
129 次
1 回答
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) 停止阻塞时,必须至少有一个可用的互斥量(假设当互斥量可用时正确地增加信号量!)
我没有试图证明这个代码是正确的,也没有测试过它......但我看不出它不应该工作的任何原因。
再一次,您可能想要使用显示器!
于 2013-04-26T05:28:11.207 回答