检查pthread锁定变量是否被锁定

时间:2014-09-05 21:18:24

标签: c pthreads mutex

我想知道是否锁定了pthread锁定变量。 一种简单的方法是使用如下所示的trylock

pthread_mutex_t lockVar;
if(pthread_mutex_trylock(&lockVar) == 0)
{
    //lock was successful
    pthread_mutex_unlock(&lockVar);
}
else
{
    //someone else holds the lock
}

如果没有获得锁定,我该如何做同样的事情?

2 个答案:

答案 0 :(得分:6)

当你同时发生多次执行时,没有"同时性"的概念。除了显式同步发生时,事件不能及时给出全局顺序。从语言中可以观察到任何可以观察到任何类型的排序的属性。

具体来说,问题是那边的互斥锁被锁定了#34;毫无意义。它没有你可以采取行动的答案。无论虚构的答案是什么,互斥体的状态都可以立即改变。没有什么可以回答像#34;是的,它已被锁定" (它可能会同时解锁),或者#34;不,它已解锁" (它可能会在你到达之前被锁定)。

使用互斥锁可以执行的 事件是尝试来锁定它。你要么失败了,要么知道它被锁定了,或者你成功了,因此知道它不是,现在你已经锁定了。

答案 1 :(得分:0)

无论你想对结果做什么,你现在就这样做是唯一的方法。您不能简单地查询互斥锁是否被锁定而不锁定它。如果你想要一个可以查询状态而不修改它的同步原语,POSIX信号量就有可能。二进制信号量可以用作锁(虽然它缺少所有者的概念,如果你需要递归锁定,这对你来说可能是一个问题)并且sem_getvalue可以确定信号量是否被“锁定”在一个时刻

至于你问的问题是否有意义,Kerrek已经告诉过你,这通常不是。以下是一些可能的,可以从消极或积极结果中收集的最低限度有用的信息:

  • 阴性:

    • 如果您知道锁定开始锁定,并且一旦解锁就不会再次锁定,这会告诉您操作已完成。在这里,trylock-and-unlock方法可以防止多个线程执行此操作,因为它会破坏“从未解锁后再次锁定”不变。
    • 可能表示在没有锁定的情况下准备数据是值得的,您可以稍后通过trylock / unlock应用,只需在准备好数据后短暂间隔。但是当然,你必须为以后锁定时发生变化的情况做好准备。
  • 正:

    • 如果你知道一旦锁定将被解锁,直到你的线程执行进一步的操作允许锁定持有者继续进行,这将为你提供锁定持有者已经到达的信息。
  • 也许其他人......

但在大多数情况下,“互斥锁被锁定了吗?”这不是一个有用的问题。