是否有一种机制来尝试锁定多个互斥量中的一个?

3

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


明白了。顺便问一下,这个用例是什么? - NPE
多个发布者和一个订阅者的发布/订阅模式。我希望当没有数据时,订阅者能够阻塞。发布者可能同时发布。 - Maz
4
@Maz,这通常需要使用条件变量或信号量,互斥锁不是正确的工具。 - Jens Gustedt
生产者消费者问题通常不是用信号量来解决吗?发布者是生产者,订阅者是消费者——除了读取后会释放信号量。你可能还需要一个“清理器”来删除文档(与订阅者相同,但不释放信号量)。 - Déjà vu
啊,我不知道生产者-消费者问题通常是如何解决的。无论如何,我的原始问题仍然存在:是否有互斥锁的“select()”等效函数? - Maz
显示剩余2条评论
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)停止阻塞时,必须至少有一个可用的互斥锁(假设在互斥锁可用时正确地增加了信号量!)

我尚未尝试证明此代码是否正确,也没有测试过它...但我不认为它不起作用。

再次强调,您可能希望使用监视器!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接