https://stackoverflow.com/a/189778/462608
在非递归互斥锁的情况下,没有所有权感,任何线程通常都可以释放互斥锁,无论哪个线程最初获取互斥锁。
我对互斥锁的研究是,当线程想要对共享对象做某事时,它会获取它,当它完成它想做的任何事情时,它会释放锁。同时其他线程可以休眠或自旋锁。
上面引用的意思是“任何线程通常都可以释放互斥锁,无论哪个线程最初使用互斥锁。” ?
我错过了什么?
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。
最重要的是,在不同的线程上解锁互斥锁是永远不可能的,即使事情似乎有效。