码农知识堂 - 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;
  • 相关阅读:
    《QT+PCL第六章》点云配准icp系列4
    DB2HADR 一主多备 环境搭建 centos7搭建db2 hadr 一主多备
    Pytorch框架学校记录11——搭建小实战完整细节
    单例模式(饿汉式单例 VS 懒汉式单例)
    输入法在 Android13上候选词 候选区域 不显示的问题
    【计算机网络】HTTP 重定向的应用场景
    模板的全局特化
    代码随想录第51天 | 309.最佳买卖股票时机含冷冻期 、 714.买卖股票的最佳时机含手续费
    Final Cut Pro 10.6.10中文用法儿
    2021CCPC山东省赛题解BCDFGHM
  • 原文地址:https://blog.csdn.net/qq_53413129/article/details/126147218
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号