C++ 对象的成员锁嵌套问题
C++类中2个函数A和函数B,A,B都有同一个互斥锁, A获得互斥锁后,再调用B; 这样的嵌套锁会带来啥问题 ?
具体地,如果函数 A 获得互斥锁后,然后调用函数 B,而函数 B 也需要获取同一个锁,但此时锁已经被函数 A 持有,因此函数 B 会被阻塞,等待函数 A 释放锁。但是,因为函数 B 依赖于函数 A 的执行,所以函数 A 也无法继续执行,直到函数 B 获得锁并完成执行。这样,两个函数都被阻塞,无法向前执行,从而导致死锁。
为避免这种情况,可以在函数 A 中释放锁,让函数 B 获得锁并执行完毕后再重新获取锁。或者,可以避免函数 A 和函数 B 之间的锁嵌套,尽可能地将锁的作用范围限制在单个函数内部,避免在一个函数中调用另一个需要同一个锁的函数。
递归锁
pthread_mutexattr_settype(&mutex_attribute, PTHREAD_MUTEX_RECURSIVE);
使用 pthread_mutexattr_settype 函数将互斥锁设置为可重入的(即递归锁,PTHREAD_MUTEX_RECURSIVE),这样可以防止同一个线程多次获取锁时出现死锁问题。