pthread_mutex_trylock的返回和pthread_mutex_lock的返回之间有什么区别

时间:2013-08-23 00:59:51

标签: c linux unix pthreads

我阅读了Linux手册页和pthread_mutex_lock的OpenGroup,并得到了这个:

  

如果成功,则pthread_mutex_lock()和pthread_mutex_unlock()   函数应返回零,否则,应返回错误号   返回表示错误。

     

如果获取了互斥锁引用的互斥对象上的锁,则pthread_mutex_trylock()函数将返回零。除此以外,   返回错误号以指示错误。

  1. 我对这两行感到困惑。如果你在成功时返回零并且在错误时返回非零,那么他们在哪里写两行?
  2. 我知道互斥锁可以锁定和解锁,但获取互斥锁是什么意思?

1 个答案:

答案 0 :(得分:10)

在此上下文中获取互斥锁表示当时没有线程持有锁。如果互斥锁是递归的,则对pthread_mutex_trylock()的调用将成功,除非它被递归锁定了太多次。

您可以将pthread_mutex_trylock()视为非阻塞调用,如果它已被阻止,则会返回错误。如果它返回成功,则表示您拥有锁,就好像pthred_mutex_lock()成功返回一样。如果它以EBUSY失败,则意味着其他人持有锁。如果它以EOWNERDEAD失败,则锁由另一个线程保持,但该线程已经死亡(实际上锁定成功,但当前数据状态可能不一致)。如果它以EAGAIN失败,则会递归锁定太多次。还有其他失败原因,但在这些情况下,尚未获得锁定。

int error = pthread_mutex_trylock(&lock);
if (error == 0) {
    /*... have the lock */
    pthread_mutex_unlock(&lock);
} else if (error == EBUSY) {
    /*... failed to get the lock because another thread holds lock */
} else if (error == EOWNERDEAD) {
    /*... got the lock, but the critical section state may not be consistent */
    if (make_state_consistent_succeeds()) {
        pthread_mutex_consistent(&lock);
        /*... things are good now */
        pthread_mutex_unlock(&lock);
    } else {
        /*... abort()? */
    }
} else {
    switch (error) {
    case EAGAIN: /*... recursively locked too many times */
    case EINVAL: /*... thread priority higher than mutex priority ceiling */
    case ENOTRECOVERABLE:
                 /*... mutex suffered EOWNERDEAD, and is no longer consistent */
    default:
        /*...some other as yet undocumented failure reason */
    }
}

EAGAINEINVALENOTRECOVERABLEEOWNERDEAD也会与pthread_mutex_lock()同时发生。有关详细信息,请参阅documentationman page