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

Multithreading 无论哪个线程最初使用互斥锁,任何线程通常如何释放非递归互斥锁?,multithreading,pthreads,mutex,Multithreading,Pthreads,Mutex,在非递归互斥体的情况下,没有所有权感,任何线程通常都可以释放互斥体,无论哪个线程最初使用互斥体 我对互斥体的研究是,当线程想要对共享对象执行某些操作时,它会获取互斥体,当它完成它想要执行的任何操作时,它会释放锁。同时,其他线程可以休眠或自旋锁 上面引用的“任何线程通常都可以释放互斥锁,无论哪个线程最初使用互斥锁”,这是什么意思 我遗漏的要点是什么?不同的线程实现可能会有所不同,但由于您已将问题标记为“pthreads”,我假设您对pthread互斥体感兴趣(而不是vxworks互斥体,这显然是您

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

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

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


我遗漏的要点是什么?

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


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

非锁定pthread_mutex的线程解锁pthread_mutex的规范取决于互斥类型(最多返回一个错误):

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

  • PTHREAD\u MUTEX\u NORMAL
  • PTHREAD\u MUTEX\u DEFAULT
尝试解锁未锁定的线程上的互斥锁会返回以下类型的错误(
EPERM
):

  • PTHREAD\u MUTEX\u ERRORCHECK
  • PTHREAD\u MUTEX\u RECURSIVE
有关详细信息,请参阅

底线是,在不同的线程上解锁互斥锁永远都是不好的,即使事情看起来很正常