什么';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:谢谢,我不知道。那些该死的标准机构不断更新标准。。。