pthread_mutex_trylock的返回和pthread_mutex_lock的返回有什么区别?

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

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

如果获取互斥体引用的互斥锁对象,则pthread_mutex_trylock()函数将返回零。 否则,将返回一个错误编号来指示错误。

  1. 我被这两行弄糊涂了。 如果你在成功的时候返回零,并且在错误的时候返回非零,他们在哪里写这两行呢?
  2. 我知道互斥锁可以被locking和解锁,但是获取互斥锁是什么意思?

Solutions Collecting From Web of "pthread_mutex_trylock的返回和pthread_mutex_lock的返回有什么区别?"

在这种情况下,获得互斥意味着当时没有线程持有锁。 如果该互斥锁是递归的,那么对pthread_mutex_trylock()的调用将会成功,除非它被递归地锁定了太多次。

你可以把pthread_mutex_trylock()想象成一个非阻塞的调用,如果它被阻塞了,它会返回一个错误。 如果返回成功,则意味着您拥有锁,就像pthred_mutex_lock()成功返回一样。 如果EBUSY失败,则意味着其他人正在锁定。 如果使用EOWNERDEAD失败,则该锁被另一个线程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()一起发生。 有关更多信息,请参阅文档和手册页 。