3

程序如何尝试同时锁定多个互斥锁,并知道它最终解锁了哪个互斥锁。本质上,我正在寻找的是select()互斥锁的等价物。这样的事情存在吗?如果没有,是否有任何实现它的库?

4

1 回答 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 回答