如何检查是否未获取互斥锁?

时间:2014-10-08 14:39:18

标签: c pthreads mutex

我想检查互斥锁是否空闲且未获取。

我尝试使用pthread_mutex_trylock(mutex_object);

但是,如果获取了互斥锁,那么返回0,而对于错误,则返回-1

如果未获取互斥锁怎么办?它会为它返回任何值吗?

3 个答案:

答案 0 :(得分:12)

pthread_mutex_trylock不会返回" -1表示错误"。它会返回一个'错误'来自errno.h中可能值的代码。其中一个EBUSY表示另一个线程已拥有该锁。除非您的程序中存在严重错误,否则您不应该发现pthread_mutex_trylock中的任何其他错误代码。

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

答案 1 :(得分:6)

pthread_mutex_trylock获取调用线程的互斥锁,如果互斥锁当前处于锁定状态,则返回EBUSY。这是测试互斥锁是否被锁定的唯一有意义的方法。在多线程环境中,只检查"的是其他人持有此互斥锁的功能。没用,因为在函数返回后,另一个线程可以立即获取互斥锁。

答案 2 :(得分:0)

您通常使用pthread_mutex_lock,trylock是一种更深奥的非阻塞变体,可用于例如用于避免优先级倒置场景中的死锁。如果您获得0返回,则互斥锁是免费的,现在已被您锁定。