我想检查互斥锁是否空闲且未获取。
我尝试使用pthread_mutex_trylock(mutex_object);
但是,如果获取了互斥锁,那么返回0
,而对于错误,则返回-1
。
如果未获取互斥锁怎么办?它会为它返回任何值吗?
答案 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返回,则互斥锁是免费的,现在已被您锁定。