Linux中条件变量的使用及注意事项

条件变量

  • 应用场景:生产者消费者问题(类似于出租车和乘客问题)
  • 必要性:为了实现等待某个资源,让线程休眠。提高运行效率
  • 函数如下:
    int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
    int pthread_cond_timewait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime);
    int pthread_cond_signal(pthread_cond_t *cond);
    int pthread_cond_broadcast(pthread_cond_t *cond);
  • 使用步骤:
    1.初始化:
    静态初始化
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //初始化条件变量
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //初始化互斥量
    或使用动态初始化
    pthread_cond_init(&cond);
    2.生产资源线程:
    pthread_mutex_lock(&mutex);
    3.开始产生资源
    pthread_cond_sigal(&cond); //通知一个消费线程
    或者
    pthread_cond_broadcast(&cond); //广播通知多个消费线程
    pthread_mutex_unlock(&mutex);
    4.消费者线程:
    pthread_mutex_lock(&mutex);
    while (如果没有资源){ //防止惊群效应
    pthread_cond_wait(&cond, &mutex);
    }
    5.有资源了,消费资源
    pthread_mutex_unlock(&mutex);
  • 注意:
    1 pthread_cond_wait(&cond, &mutex),在没有资源等待是是先unlock 休眠,等资源到了,再lock
    所以pthread_cond_wait he pthread_mutex_lock 必须配对使用。
    2 如果pthread_cond_signal或者pthread_cond_broadcast 早于 pthread_cond_wait ,则有可能会丢失信号。
    3 pthead_cond_broadcast 信号会被多个线程收到,这叫线程的惊群效应。所以需要加上判断条件while循环。
  • 代码如下:
    在这里插入图片描述
    在这里插入图片描述
    注:这里有个疑问,就是while(Head==NULL)时候执行下面的语句,但此时出租车线程怎么获取到的上锁,原因就是pthread_cond_wait函数内部有上锁和解锁操作
  • 执行如下:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/438739.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

扩展学习|一文明晰推荐系统应用开发核心技术发展

文献来源:Lu J, Wu D, Mao M, et al. Recommender system application developments: a survey[J]. Decision support systems, 2015, 74: 12-32. 主题:关于推荐系统应用开发的调查研究 关键词:推荐系统、电子服务个性化、电子商务、电子学习、电子政务 …

【一】esp32芯片开发板环境搭建

1、esp32的源码在github上的地址 不同的芯片支持的源码版本不一样,需要根据自己的实际的esp32开发板的芯片下载不用版本的代码 esp32支持多种开发方式,如arduino,ESP-IDF等。官方推荐使用idf开发,ESP-IDF 是乐鑫官方推出的物联网开…

thinkadmin用户列表点击用户晒单记录弹出窗体显示关联表记录

admin.html <!--{if auth("mark")}--><a class="layui-btn layui-btn-sm layui-btn-primary" data-modal="{:url(user.mark/index)}?user_id={$vo.id}"

HarmonyOS Slider滑动条组件讲解

好 那么 我们继续来说 ArkTS提供的基础组件 今天 我们来说 slider slider 是一个滑块组件 我们还是在组件中 编写一个 Slider 然后鼠标移上去 弹出提示时 点击进入API 这个组件相对是比较复杂的 min 数字类型 默认值 0 控制 最小是多少 max 数值类型 默认值 100 我们滑块 正…

虚拟机设置静态ip

有时候搭环境需要局域网&#xff0c;设置一下虚拟机静态ip&#xff0c;这里做个记录&#xff1a; 这里我用的是ubuntu18.04的虚拟机&#xff0c;安装完成之后&#xff0c;点击进入设置 这里设置一下桥接模式 这个时候输入ifconfig&#xff0c;就是和主机一个网段了&#xff…

【UEFI实战】Redfish的BIOS实现——生成EDK数据

生成Redfish文件 Redfish数据的表示形式&#xff0c;最常用的是JSON。将JSON表示的数据转换成C语言可以操作的结构体&#xff0c;是必不可少的步骤。当然如果手动转换的话&#xff0c;需要浪费大量的时间&#xff0c;因此DMTF组织开发了一个工具&#xff0c;用于将JSON数据快速…

大专生能不能学习鸿蒙开发?

目前安卓有2,000万的开发者。本科及以上学历占比为35%&#xff1b;iOS有2,400万开发者&#xff0c;本科及以上学历占比为40% 绝大多数的前端开发者都是大专及以下学历&#xff0c;在2023年华为开发者大会上余承东透露华为的开发者目前有200万&#xff0c;但鸿蒙开发者统计的数据…

Java 数据库连接

1&#xff0c;JDBC概述 在开发中我们使用的是java语言&#xff0c;那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 …

实现Crm系统的灵活配置,满足不同行业客户需求

目录 一&#xff1a;数据模型配置 二&#xff1a;流程配置 三&#xff1a;扩展性配置 实现CRM系统的可配置性需要关注以下几个方面&#xff1a; 一&#xff1a;数据模型配置 为了满足企业的个性化需求&#xff0c;CRM系统需要提供灵活的数据模型配置。用户可以根据自己的业…

vue预览pdf文件的几种方法

文章目录 vue预览pdf集中方法方法一&#xff1a;方法二&#xff1a;展示效果&#xff1a;需要包依赖&#xff1a;代码&#xff1a; 方法三&#xff1a;展示效果&#xff1a;需要包依赖&#xff1a;代码&#xff1a;自己调参数&#xff0c;选择符合自己的 vue预览pdf集中方法 我…

解密你的文件:预防和应对.faust病毒的有效手段

导言&#xff1a; 近期&#xff0c;网络世界再次被.faust勒索病毒的阴影笼罩。这种狡猾的病毒以其高级的加密算法著称&#xff0c;它会将用户的数据文件变成数字谜团&#xff0c;然后要求支付赎金以还原这一谜团。本文91数据恢复将深入探讨.faust勒索病毒的特点&#xff0c;如…

【并发编程】volatile原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程⛺️稳重求进&#xff0c;晒太阳 volatile原理实现是内存屏障&#xff0c;Memory Barrier 对volatile变量的写指令后会加入写屏障。对volatile变量的读指令前会加入读屏障 如何保…