2014-10-08 23 views
4

我想检查互斥锁是否空闲并且不被获取。如何检查是否没有获取互斥锁?

我试图用pthread_mutex_trylock(mutex_object);

但是,如果返回互斥量被收购了0-1错误。

如果没有获取互斥量,该怎么办?它会为它返回任何价值吗?

回答

12

pthread_mutex_trylock不返回“-1表示错误”。它从errno.h中的可能值返回一个“错误”代码。其中之一EBUSY意味着另一个线程已经拥有该锁。除非程序中存在严重的错误,否则您不应该观察pthread_mutex_trylock中的任何其他错误代码。

请注意,对于递归互斥锁,返回值0不区分互斥锁先前已解锁的情况和调用线程已拥有它的情况。在任何情况下,如果pthread_mutex_trylock返回0,那么在您成为pthread_mutex_trylock后您成为所有者(或者,在递归情况下,锁计数增加1),您将负责通过pthread_mutex_unlock解锁。

6

pthread_mutex_trylock获取调用线程的互斥锁或返回EBUSY如果互斥锁当前被锁定。这是测试互斥锁是否被锁定的唯一有意义的方法。在多线程环境中,只检查“是否有其他人持有该互斥锁”的函数是无用的,因为函数立即返回另一个线程可以获取互斥锁。

0

您通常使用pthread_mutex_lock,trylock是一个更深奥的非阻塞变体,用于避免优先级反转场景中的死锁。如果你获得0回报,互斥量是免费的,现在被你锁定。