码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Linux操作系统】--多线程(二)--条件变量


    目录

    Linux线程同步

    条件变量

    条件变量的作用:

    条件变量的用法:

    条件变量简单案例:

    为什么pthread_cond_wait需要互斥量?

    生产者消费者模型

    为何要使用生产者消费者模型

    生产者消费者模型优点

    基于BlockingQueue的生产者消费者模型

    C++ queue模拟阻塞队列的生产消费模型

    复盘生产者消费者问题

    POSIX信号量

    1.回顾信号量的概念

    2.认识信号量对应的操作函数

    3.认识环形队列

    4.结合sem+环形队列编写生产消费模型


    Linux线程同步

    条件变量

    什么是条件变量:

    条件变量是利用线程间共享的全局变量进行同步的一种机制。主要包括两种动作:

    • 线程等待条件变量的成立而挂起
    • 另一个线程使条件变量成立而通知其它线程。

    这个怎么理解呢?举个例子:当你去超市买手机,问售货员有没有苹果13,售货员需要在苹果13到的时候才知道有没有苹果13,那么你需要等待售货员的通知,这个时候你是被挂起的,在wait售货员;同时当苹果13到店里的时候,售货员知道了有苹果13,条件成立了,售货员通知你苹果13到了,这个时候就是发信号signal的时候。

    一般条件变量需要与互斥锁同时使用,那么互斥锁的用处在下面的例子有讲到。

    条件变量的作用:

    使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止,条件变量一般是与互斥锁一起使用的,对条件变量的测试一般是在互斥锁的保护下进行的。

    条件变量的用法:

    初始化:

    条件变量的初始化和创建进程初始化一摸一样,只是换了个名字,条件变量初始化也包括动态初始化和静态初始化

    动态初始化:

    int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr); 参数:

    cond:要初始化的条件变量

    attr:NULL--设置条件变量属性,一般设置为NULL即可

    返回值:

    成功返回0,失败返回错误码

    静态初始化:

    pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

    销毁:

    int pthread_cond_destroy(pthread_cond_t *cond)

    等待条件满足:

    int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);

    参数:

    cond:要在这个条件变量上等待

    mutex:互斥量,后面详细解释

    唤醒等待:

    int pthread_cond_broadcast(pthread_cond_t *cond); //唤醒所有进程

    int pthread_cond_signal(pthread_cond_t *cond);       //唤醒一个进程

    条件变量简单案例:

    思路:

    创建一个master线程和3个worker线程,master线程用来发送信号signal,worker的每个线程接收到master线程信号开始做自己的动作。

    主函数中的主线程工作:初始化(线程,条件变量),创建线程,等待线程,销毁。

    两个新线程的动作:master状态就绪发送信号,唤醒等待队列中的线程,worker线程阻塞等待接收信号,再做动作。我们使用了pthread_cond_signal唤醒队列中的线程,那么唤醒的是哪一个呢?唤醒的是队列中第一个线程。

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. pthread_mutex_t mtx;//互斥锁
    7. pthread_cond_t cond;//条件变量
    8. void* ctrl(void* args)
    9. {
    10. std::string name=(char*)args;
    11. while(true)
    12. {
    13. std::cout<<"master say:begin work"<
    14. //pthread_cond_broadcast(&cond);
    15. pthread_cond_signal(&cond);
    16. sleep(1);
    17. }
    18. }
    19. void* work(void* args)
    20. {
    21. int number=*(int*)args;
  • 相关阅读:
    【全网最细】谷歌小恐龙无敌代码它来了!
    FFmpeg入门详解之122:Qt5 FFmpeg本地摄像头采集预览实战
    Docker安装与应用全套讲解
    C++(第一篇):C++基础入门知识
    分布式文件系统FastDFS实战
    Docker入门
    java毕业生设计医药网络挂号系统计算机源码+系统+mysql+调试部署+lw
    jbase代码生成器(成型篇)
    让Python更优雅更易理解
    大数据安全 | 【实验】RSA加密解密
  • 原文地址:https://blog.csdn.net/qq_53413129/article/details/126147218
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号