无论哪个线程最初使用互斥锁,任何线程通常如何释放非递归互斥锁?

时间:2012-05-11 09:36:07

标签: multithreading pthreads mutex

https://stackoverflow.com/a/189778/462608

  

在非递归互斥锁的情况下,没有所有权感,任何线程通常都可以释放互斥锁,无论哪个线程最初使用互斥锁。

我对Mutexes的研究是,一个线程在想要对共享对象做某事时获取它,当它完成它想要做的任何事情时,就会释放锁。同时其他线程可以睡眠或自旋锁。

以上引用的含义是什么?"无论哪个线程最初使用互斥锁,任何线程通常都可以释放互斥锁。"

我错过了什么?

2 个答案:

答案 0 :(得分:4)

这可能因不同的线程实现而有所不同,但由于您使用“pthreads”标记了您的问题,我假设您对pthread互斥体感兴趣(而不是vxworks互斥体,这显然是您提供的链接描述的内容)。

因此在pthreads中,规则是锁定互斥锁的同一个线程必须解锁它。您可以在互斥锁对象上设置属性,无论您是否希望在违反此规则时生成错误,或者结果是否为未定义的行为(例如,对于调试版本与发布版本)。有关详细信息,请参阅pthread_mutexattr_settype函数的联机帮助页。

答案 1 :(得分:1)

通过不是锁定它的线程解锁pthread_mutex_t的规范取决于互斥锁类型(最多只返回错误):

尝试在未锁定它的线程上解锁互斥锁是以下互斥锁类型的未定义行为:

  • PTHREAD_MUTEX_NORMAL
  • PTHREAD_MUTEX_DEFAULT

尝试在没有锁定它的线程上解锁互斥锁会为这些类型返回错误(EPERM):

  • PTHREAD_MUTEX_ERRORCHECK
  • PTHREAD_MUTEX_RECURSIVE

有关详细信息,请参阅http://pubs.opengroup.org/onlinepubs/007904875/functions/pthread_mutex_lock.html

最重要的是,即使事情似乎有效,在其他线程上解锁互斥锁永远都不行。