码农知识堂 - 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;
  • 相关阅读:
    【vue】下拉、上拉刷新
    【NSDictionary数组的使用 Objective-C语言】
    【LeetCode】每日一题 2023_11_20 最大子数组和(dp)
    记一次重大的问题解决
    NLP之TextRNN(预测下一个单词)
    EsayExcel如何在业务层中获取表头?
    2.28 OrCAD中怎么对元器件管脚属性进行统一更改?
    SSH远程登录时常见问题解决
    Fabric.js 使用纯色遮挡画布(前景色)
    纯Python实现遗传算法
  • 原文地址:https://blog.csdn.net/qq_53413129/article/details/126147218
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号