是否有机制试图锁定几个互斥锁中的一个?

时间:2013-03-23 16:57:03

标签: c multithreading pthreads mutex

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

1 个答案:

答案 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)停止阻塞时,必须至少有一个可用的互斥锁(假设在互斥锁可用时正确递增信号量!)

我没有试图证明这个代码是正确的,也没有对它进行过测试......但我认为没有任何理由说它不起作用。

再一次,您可能想要使用显示器!