当前位置: 首页 > news >正文

pthread 变量静态初始化 避免使用被销毁过的变量

pthread 变量静态初始化

  • 互斥锁:pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
  • 读写锁:pthread_rwlock_t g_rwlock = PTHREAD_RWLOCK_INITIALIZER;
  • 条件变量:pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;

适用场景

  • 以互斥锁为例,当持有互斥锁的线程,需要进行互斥锁的销毁工作时,无法确保当前没有任何其他线程会在锁销毁之后,仍使用该锁。

场景代码

  • 模块 xx 对外提供3个 api,分别为打开,关闭,资源获取,资源获取接口以及关闭接口可能会被外部不同的线程调用,因此需要使用互斥锁保护,如果关闭接口先于资源获取接口获得互斥锁,且关闭接口中执行了互斥锁的销毁,则会导致阻塞在资源获取接口上的线程使用被销毁过的互斥锁。

  • 代码如下:

    #include <pthread.h>pthread_mutex_t mutex;int xx_init()
    {pthread_mutex_init(&mutex, NULL);// ...
    }int xx_getres()
    {pthread_mutex_lock(&mutex);// ...pthread_mutex_unlock(&mutex);
    }int xx_close()
    {pthread_mutex_lock(&mutex);// ...pthread_mutex_unlock(&mutex);pthread_mutex_destroy(&mutex);
    }
    

解决方案

  • 第一种方案就是控制外部调用,保证在调用关闭接口之前,没有任何其他线程阻塞在资源获取接口上。

  • 第二种方案就是使用静态初始化,代码如下:

    #include <pthread.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int xx_init()
    {// ...
    }int xx_getres()
    {pthread_mutex_lock(&mutex);// ...pthread_mutex_unlock(&mutex);
    }int xx_close()
    {pthread_mutex_lock(&mutex);// ...pthread_mutex_unlock(&mutex);
    }
    
http://www.lryc.cn/news/215190.html

相关文章:

  • 深度学习之基于ResNet18的神经网络水果分类系统
  • 并查集易错点
  • 车载网关产品解析(附:车载网关详细应用案例及部署流程)
  • 高校教务系统登录页面JS分析——天津大学
  • 68 内网安全-域横向PTHPTKPTT哈希票据传递
  • 【1】2023版密评算分工具
  • 人工智能常用网站
  • OpenLayers实战,OpenLayers结合下拉菜单实现城市切换,动态切换城市边界到地图视图视角范围内
  • UE5 日记(人物连招:蒙太奇动画通知(含视频链接))
  • 葡萄酒是如何从葡萄园到你的酒杯的?
  • Oracle Exadata X7-2掉电宕机导致集群无法启动处理过程
  • 锐捷RG-EW1200G登录绕过漏洞复现
  • Python之循环语句
  • python中使用websocket调用、获取、保存大模型API
  • Linux的账号管理
  • 优优嗨聚集团:医保新政来袭,乙类OTC、保健品或将退出医保舞台,影响几何?
  • ubuntu安装pandora-gpt
  • PHP校验身份证号是否正确
  • [C++ ]:5.类和对象中(运算符重载补充)+ 类和对象下(初始化列表)
  • D. Doremy‘s Connecting Plan Codeforces Round 906 (Div. 2)
  • Prometheus+Grafana
  • CoCa论文笔记
  • uniapp 微信小程ios端键盘弹起后导致页面无法滚动
  • 三维模型优势在哪里?如何提升产品自身商业价值?
  • WheatA 轻量级生态数据软件
  • 2127. 参加会议的最多员工数 : 啥是内向/外向基环树(拓扑排序)
  • Qt入门日记1
  • SpringBoot_第七章(读写分离)
  • linux下mysql-8.2.0集群部署(python版本要在2.7以上)
  • 40 深度学习(四):卷积神经网络|深度可分离卷积|colab和kaggle的基础使用