【问题标题】:How to check if a mutex is not acquired?如何检查是否未获取互斥锁?
【发布时间】:2014-10-08 14:39:18
【问题描述】:

我想检查互斥锁是否空闲且未被获取。

我尝试使用pthread_mutex_trylock(mutex_object);

但如果获取互斥体,则返回 0,如果错误则返回 -1

如果没有获取互斥锁怎么办?它会返回任何值吗?

【问题讨论】:

    标签: c pthreads mutex


    【解决方案1】:

    pthread_mutex_trylock 不返回“-1 错误”。它从errno.h 中的可能值返回一个“错误”代码。其中之一,EBUSY,意味着另一个线程已经拥有锁。除非您的程序中有严重的错误,否则您不应看到来自 pthread_mutex_trylock 的任何其他错误代码。

    请注意,对于递归互斥体,返回值 0 不会区分互斥体先前解锁的情况和调用线程已经拥有它的情况。在任何情况下,如果 pthread_mutex_trylock 返回 0,您有责任通过 pthread_mutex_unlock 解锁它,因为您在成功的 pthread_mutex_trylock 时成为所有者(或者,在递归情况下,您的锁计数增加 1)。

    【讨论】:

      【解决方案2】:

      pthread_mutex_trylock 获取调用线程的互斥锁,如果互斥锁当前被锁定,则返回EBUSY。这是测试互斥锁是否被锁定的唯一有意义的方法。在多线程环境中,仅检查“是否有其他人持有此互斥锁”的函数是没有用的,因为在函数返回后,另一个线程可以立即获取互斥锁。

      【讨论】:

        【解决方案3】:

        您通常使用 pthread_mutex_lock,trylock 是一种更深奥的非阻塞变体,用于例如用于避免优先级反转场景中的死锁。如果返回 0,则互斥锁是空闲的,现在已被您锁定。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-11
          • 2021-06-10
          • 1970-01-01
          • 2010-12-25
          • 1970-01-01
          • 1970-01-01
          • 2011-04-08
          相关资源
          最近更新 更多