首页 > 其他 > 详细

递归锁和非递归锁

时间:2020-06-11 02:24:04      阅读:114      评论:0      收藏:0      [点我收藏+]

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!