【问题标题】:Is there a mechanism to try to lock one of several mutexes?是否有一种机制可以尝试锁定几个互斥锁之一?
【发布时间】:2013-03-13 10:31:19
【问题描述】:

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

【问题讨论】:

  • 您可以在每个互斥锁中依次调用pthread_mutex_trylock() 吗?还是您希望它在互斥锁可用之前阻止该问题?
  • 这是一个繁忙的循环。如果没有sleep() 调用,线程将使用 100% 的 CPU。此外,简单地阻塞quasy_select() 的调用者,然后在解锁一个锁时解除阻塞会更有效。
  • 明白。出于兴趣,用例是什么?
  • 具有多个发布者和一个订阅者的 Pub/Sub。我希望订阅者在没有数据时阻止。发布者可能同时发布。
  • @Maz,这通常是条件变量甚至信号量,互斥锁不是正确的工具。

标签: c multithreading pthreads mutex


【解决方案1】:

我(几乎)确定应该使用监视器(以及使用信号/等待/广播的条件变量)来实现这种功能,但我认为您可以通过一个额外的信号量来解决您的问题。

假设所有互斥对象都以“锁定”状态开始,创建一个初始值为 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) 停止阻塞时,必须至少有一个可用的互斥锁(假设您在互斥锁可用时正确地递增信号量!)

我没有试图证明这段代码是正确的,也没有测试过它......但我看不出它不应该工作的任何原因。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多