4

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

谢谢

4

3 回答 3

10

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

您可以创建一个类型的互斥锁,PTHREAD_MUTEX_RECURSIVE以便能够递归锁定它,这是通过向pthread_mutex_init 提供具有所需互斥锁类型的pthread_mutexattr_t来完成的

于 2012-07-19T19:31:00.453 回答
3

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

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

另请参见pthread_mutex_attr_settype

于 2012-07-19T19:31:09.787 回答
2

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

      pthread_mutexattr_t Attr;
      pthread_mutexattr_init(&Attr);
      pthread_mutexattr_settype(&Attr, PTHREAD_MUTEX_RECURSIVE);
      pthread_mutex_init(&_mutex, &Attr);
于 2015-09-02T19:02:35.323 回答