1.递归锁和非递归锁含义
递归锁:在同一个线程可以多次获取同一个锁,不会产生死锁。
非递归锁:在同一个线程中,加锁后不可以再次获取该锁,如果获取可能产生死锁。
2.常用锁的递归和非递归属性
linux下的pthread_mutex_t是非递归锁,但是可以通过在创建互斥量时设置PTHREAD_MUTEX_RECURSIVE属性,将pthread_mutex_t设置为递归锁。
读写锁是非递归锁。
尽量不要使用递归锁,即同一个线程中,尽量不要重复锁定同一个锁,读锁也不可以。
3.一个死锁
下面是使用读写锁导致的死锁问题,因为读写锁是非递归锁。
void *process() { pthread_rwlock_wrlock(&g_lock); // 2.加写锁,此时会一直等待,导致死锁 pthread_rwlock_unlock(&g_lock); // 释放写锁 return NULL; } int main() { pthread_rwlock_t g_lock; pthread_rwlock_rdlock(&g_lock); // 1.第1次加读锁 create_thread(process); // 创建线程 sleep(5); // 等待几秒 pthread_rwlock_rdlock(&g_lock); // 3.第2次加读锁,此时会一致等待,导致死锁 pthread_rwlock_unlock(&g_lock); // 释放第1次的读锁 pthread_rwlock_unlock(&g_lock); // 释放第2次的读锁 }
原文:https://www.cnblogs.com/iamwho/p/13089347.html