我来自Java,所以我熟悉同步而不是互斥。 我想知道pthread_mutex_t是否也是重入。如果没有,还有另一种机制吗?
谢谢
答案 0 :(得分:6)
这取决于互斥锁类型,默认情况下不进行检查,并且尝试在同一线程中多次锁定它会导致未定义的行为。阅读它here。
您可以创建PTHREAD_MUTEX_RECURSIVE
类型的互斥锁,以便能够递归锁定它,这是通过向pthread_mutexattr_t
答案 1 :(得分:3)
根据the manual,您可以将互斥对象声明为PTHREAD_MUTEX_RECURSIVE:
如果互斥锁类型为PTHREAD_MUTEX_RECURSIVE,则互斥锁应为 保持锁定计数的概念。当一个线程成功 首次获取互斥锁,锁定计数应设置为 一。每次线程重新锁定此互斥锁时,锁定计数应为 增加1。每次线程解锁互斥锁时,锁定 计数应减1。当锁定计数达到零时, 互斥体可供其他线程获取。如果一个 线程尝试解锁未锁定的互斥锁或互斥锁 解锁后,将返回错误。
答案 2 :(得分:0)
默认情况下,pthread_mutex
不是递归的,但有一种方法可以将其初始化为递归:
pthread_mutexattr_t Attr;
pthread_mutexattr_init(&Attr);
pthread_mutexattr_settype(&Attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&_mutex, &Attr);