linux中的pthread_mutex_t是否重入(如果一个线程试图获取它已经存在的锁,请求成功)

时间:2012-07-19 19:24:23

标签: c++ c linux multithreading

我来自Java,所以我熟悉同步而不是互斥。 我想知道pthread_mutex_t是否也是重入。如果没有,还有另一种机制吗?

谢谢

3 个答案:

答案 0 :(得分:6)

这取决于互斥锁类型,默认情况下不进行检查,并且尝试在同一线程中多次锁定它会导致未定义的行为。阅读它here

您可以创建PTHREAD_MUTEX_RECURSIVE类型的互斥锁,以便能够递归锁定它,这是通过向pthread_mutexattr_t

提供所需互斥锁类型的pthread_mutex_init来完成的。

答案 1 :(得分:3)

根据the manual,您可以将互斥对象声明为PTHREAD_MUTEX_RECURSIVE:

  

如果互斥锁类型为PTHREAD_MUTEX_RECURSIVE,则互斥锁应为   保持锁定计数的概念。当一个线程成功   首次获取互斥锁,锁定计数应设置为   一。每次线程重新锁定此互斥锁时,锁定计数应为   增加1。每次线程解锁互斥锁时,锁定   计数应减1。当锁定计数达到零时,   互斥体可供其他线程获取。如果一个   线程尝试解锁未锁定的互斥锁或互斥锁   解锁后,将返回错误。

另见pthread_mutex_attr_settype

答案 2 :(得分:0)

默认情况下,pthread_mutex不是递归的,但有一种方法可以将其初始化为递归:

      pthread_mutexattr_t Attr;
      pthread_mutexattr_init(&Attr);
      pthread_mutexattr_settype(&Attr, PTHREAD_MUTEX_RECURSIVE);
      pthread_mutex_init(&_mutex, &Attr);