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



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

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

我对互斥体的研究是,当线程想要对共享对象执行某些操作时,它会获取它,当它完成它想要做的事情时,它会释放锁。同时,其他线程可以休眠或旋转锁定。

上面引用的"任何线程通常都可以释放互斥锁,无论哪个线程最初采用互斥锁"是什么意思?

我错过了什么?

这在不同的线程实现之间可能有所不同,但由于您已经用"pthreads"标记了您的问题,我假设您对 pthread 互斥锁感兴趣(而不是 vxworks 互斥锁,这显然是您提供的链接所描述的)。

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

通过不是锁定它的线程解锁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。

最重要的是,解锁

不同线程上的互斥锁是永远不行的,即使事情看起来很正常。

最新更新