5

我阅读了 Linux 手册页和 OpenGrouppthread_mutex_lock并得到了这个:

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

如果获得了对 mutex 引用的 mutex 对象的锁定,则 pthread_mutex_trylock() 函数应返回零。否则,返回错误号以指示错误。

  1. 我被这两条线弄糊涂了。如果您在成功时都返回零并且在错误时返回非零,那么他们在哪里写了两行?
  2. 我知道互斥锁可以锁定和解锁,但是获得互斥锁是什么意思?
4

1 回答 1

11

在这种情况下,获得互斥锁意味着当时没有线程持有锁。如果互斥锁是递归的,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 */
    }
}

, EAGAIN,EINVALENOTRECOVERABLEEOWNERDEAD发生在pthread_mutex_lock(). 有关更多信息,请参阅文档手册页

于 2013-08-23T01:03:41.723 回答