【发布时间】:2014-10-08 14:39:18
【问题描述】:
我想检查互斥锁是否空闲且未被获取。
我尝试使用pthread_mutex_trylock(mutex_object);
但如果获取互斥体,则返回 0,如果错误则返回 -1。
如果没有获取互斥锁怎么办?它会返回任何值吗?
【问题讨论】:
我想检查互斥锁是否空闲且未被获取。
我尝试使用pthread_mutex_trylock(mutex_object);
但如果获取互斥体,则返回 0,如果错误则返回 -1。
如果没有获取互斥锁怎么办?它会返回任何值吗?
【问题讨论】:
pthread_mutex_trylock 不返回“-1 错误”。它从errno.h 中的可能值返回一个“错误”代码。其中之一,EBUSY,意味着另一个线程已经拥有锁。除非您的程序中有严重的错误,否则您不应看到来自 pthread_mutex_trylock 的任何其他错误代码。
请注意,对于递归互斥体,返回值 0 不会区分互斥体先前解锁的情况和调用线程已经拥有它的情况。在任何情况下,如果 pthread_mutex_trylock 返回 0,您有责任通过 pthread_mutex_unlock 解锁它,因为您在成功的 pthread_mutex_trylock 时成为所有者(或者,在递归情况下,您的锁计数增加 1)。
【讨论】:
pthread_mutex_trylock 获取调用线程的互斥锁,如果互斥锁当前被锁定,则返回EBUSY。这是测试互斥锁是否被锁定的唯一有意义的方法。在多线程环境中,仅检查“是否有其他人持有此互斥锁”的函数是没有用的,因为在函数返回后,另一个线程可以立即获取互斥锁。
【讨论】:
您通常使用 pthread_mutex_lock,trylock 是一种更深奥的非阻塞变体,用于例如用于避免优先级反转场景中的死锁。如果返回 0,则互斥锁是空闲的,现在已被您锁定。
【讨论】: