C++ 对象的成员函数锁嵌套问题

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),这样可以防止同一个线程多次获取锁时出现死锁问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.GCD队列有哪几种类型?有哪几种队列? GCD队列分为串行队列、并行队列两种类型;队列有主串行队列、全局并行队...
    oc123阅读 5,703评论 0 7
  • 目录 1. 互斥锁的实现与特点2. 自旋锁的实现和特点3. 原子操作的原理和实现方式4. 三种同步方式的应用场景 ...
    镜中无我阅读 10,977评论 0 6
  • 多线程知识的简单介绍 进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用的...
    恩说吧阅读 4,413评论 0 2
  • 多线程 多线程技术大家都很了解,而且在项目中也比较常用。比如开启一个子线程来处理一些耗时的计算,然后返回主线程刷新...
    Sunxb阅读 4,902评论 0 1
  • (转载) iOS 各种锁机制 一、前言 前段时间看了几个开源项目,发现他们保持线程同步的方式各不相同,有@syn...
    北漂老张阅读 3,180评论 0 1