【问题标题】:What's difference between pthread_mutex_trylock's return and pthread_mutex_lock's returnpthread_mutex_trylock 的 return 和 pthread_mutex_lock 的 return 有什么区别
【发布时间】:2013-08-25 22:20:03
【问题描述】:

我阅读了pthread_mutex_lock 的 Linux 手册页和 OpenGroup 并得到以下信息:

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

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

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

【问题讨论】:

    标签: c linux unix pthreads


    【解决方案1】:

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

    【讨论】:

    • 所以当我们在PTHREAD_MUTEX_RECURSIVE 模式下重新锁定互斥锁并不总是意味着我们获得了互斥锁?
    • 如果互斥体是递归的,只要互斥体处于有效状态,pthread_mutex_trylock() 就不会失败。
    • 那么我能理解acquired a mutexlock mutex suceess 一样吗?
    • @jxh:对于同样健壮的递归互斥锁,pthread_mutex_trylock 可能会因EOWNERDEAD 而“失败”(尽管这意味着互斥锁现在已被调用线程获取)。
    • @R..:谢谢,不知道。那些该死的标准机构不断更新标准......
    猜你喜欢
    • 2014-05-24
    • 2011-08-26
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多