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。
最重要的是,解锁不同线程上的互斥锁是永远不行的,即使事情看起来很正常。