什么';pthread_mutex_trylock和#x27;s return和pthread_mutex_lock';回归
我阅读了什么';pthread_mutex_trylock和#x27;s return和pthread_mutex_lock';回归,c,linux,unix,pthreads,C,Linux,Unix,Pthreads,我阅读了pthread\u mutex\u lock的Linux手册页和OpenGroup,得到了以下信息: 如果成功,pthread_mutex_lock()和pthread_mutex_unlock() 函数应返回零,否则应返回错误号 返回以指示错误 如果获取了mutex引用的mutex对象上的锁,pthread_mutex_trylock()函数将返回零。否则,, 返回一个错误号以指示错误 我被这两行字弄糊涂了。如果成功时都返回零,错误时都返回非零,那么他们在哪里写这两行呢 我知道互斥锁可
pthread\u mutex\u lock
的Linux手册页和OpenGroup,得到了以下信息:
如果成功,pthread_mutex_lock()和pthread_mutex_unlock()
函数应返回零,否则应返回错误号
返回以指示错误
如果获取了mutex引用的mutex对象上的锁,pthread_mutex_trylock()函数将返回零。否则,,
返回一个错误号以指示错误
pthread\u mutex\u trylock()
的调用将成功,除非它被递归锁定过多次
您可以将pthread\u mutex\u trylock()
视为一个非阻塞调用,如果该调用被阻塞,则返回一个错误。如果返回success,则意味着您拥有的锁就好像成功返回了pthred\u mutex\u 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
、EINVAL
、ENOTRECOVERABLE
和EOWNERDEAD
也会发生在pthread\u mutex\u lock()
上。有关更多信息,请参阅和。因此,当我们在PTHREAD\u mutex\u RECURSIVE
模式下重新锁定互斥锁时,并不总是意味着我们获取了互斥锁?如果互斥锁是递归的,PTHREAD\u mutex\u trylock()
只要互斥体处于有效状态,就不会失败。因此我能理解获取的互斥体与锁定互斥体成功
是一样的吗?@jxh:对于同样健壮的递归互斥体,pthread\u mutex\u trylock
可能会在EOWNERDEAD
下“失败”(虽然这意味着互斥锁现在被调用线程获取了)。@R:谢谢,我不知道。那些该死的标准机构不断更新标准。。。