C++多线程基础-condition_variable

C++多线程详细讲解 线程:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,进程包含一个或者多个线程。进程可以理解为完成一件事的完整解决方案,而线程可以理解为这个解决方案中的的一个步骤,可能这个解决方案就这只有一个步骤,也可能这个解决方案有多个步骤。多线程:多线程是实现并发(并行)的手段,并发(并行)即多个线程同时执行,一般而言,多线程就是把执行一件事情的完整步骤拆分为多个子步骤,然后使得这多个步骤同时执行。 阅读详情

condition_variable是同步原语,被使用在std::mutex去阻塞块在不同线程,直到线程修改共享变量并且唤醒条件变量;

线程尝试修改共享变量必须:

1、获得mutex;例如std::lock_guard

2、获得锁后修改共享变量;(即使共享变量是原子量,也要获得锁才能修改)

3、接着调用notify_one或者notify_all;

线程等等待条件变量必须:

1、获得std::unique_lock

2、做其中一种:检查条件;调用wait,wait_for,wait_until;检查条件和如果没有唤醒则重新等待,

实现简单的条件变量:

#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
 
std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;
 
void worker_thread()
{
    // Wait until main() sends data
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk, []{return ready;});
 
    // after the wait, we own the lock.
    std::cout << "Worker thread is processing data\n";
    data += " after processing";
 
    // Send data back to main()
    processed = true;
    std::cout << "Worker thread signals data processing completed\n";
 
    // Manual unlocking is done before notifying, to avoid waking up
    // the waiting thread only to block again (see notify_one for details)
    lk.unlock();
    cv.notify_one();
}
 
int main()
{
    std::thread worker(worker_thread);
 
    data = "Example data";
    // send data to the worker thread
    {
        std::lock_guard<std::mutex> lk(m);
        ready = true;
        std::cout << "main() signals data ready for processing\n";
    }
    cv.notify_one();
 
    // wait for the worker
    {
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk, []{return processed;});
    }
    std::cout << "Back in main(), data = " << data << '\n';
 
    worker.join();
}

参考:

std::condition_variable - cppreference.com

ES8311音频Codec避坑指南:从I2C通信、电平匹配到回环测试的保姆级调试笔记 本文详细解析了ES8311音频编解码芯片的调试全流程,涵盖I2C通信建立、电平匹配、主从模式配置等关键环节。通过真实案例和实用技巧,帮助工程师快速定位和解决音频Codec常见问题,提升硬件调试效率。特别针对回环测试、功耗分析等高频故障点提供了可复用的排查方法论。 阅读详情

相关推荐

S7-1200PLC 与温控仪表Modbus RTU通信

硬件:cpu 1214C 目的:通过Modbus RTU协议,实现对温控仪表的控制 软件:Portal V14SP1

weixin_43922025的博客 3万+

《C++ 多线程编程基础总结(thread / mutex / condition_variable / future / promise/atomic)》

x = x + 1;//std::ref 传递引用类型 传递的临时变量是给引用的时候要注意类型要统一t.join();return 0;传递临时变量的问题int main()//std::ref 传递引用类型 传递的临时变量是给引用的时候要注意类型要统一delete ptr;t.join();return 0;传递指针或引用指向已释放的内存的问题class Apublic:void foo()int main()

fmjjgj的博客 769

基础篇.ARM架构介绍(1)

ARM公司主要向客户提供处理器IP。ARM体系结构是一种硬件规范,主要用来约定指令集、芯片内部体系结构等。以指令集为例,ARM体系结构并没规定每一条指令在硬件IP中如何实现,只是约定了每条指令的格式、行为规范、参数等。

heshuangzong的博客 7806

[c++多线程并发 基础入门] 1.3条件变量condition_variable

条件变量 虚假唤醒

hjj1618的博客 276

一文搞懂深度学习:最全神经网络介绍

本文是深度学习系列文章的第二篇,我们将深入探讨各种类型的人工神经网络,探索它们独特的特性和应用。

2402_82802238的博客 2801

《矩阵论》学习笔记(四):4.2 矩阵的QR分解

《矩阵论》学习笔记(四):4.2 矩阵的QR分解 文章目录《矩阵论》学习笔记(四):4.2 矩阵的QR分解一. Givens矩阵与Givens变换1.1. 概念与理解1.2. Givens矩阵求解方法二. Householder矩阵与Householder变换2.1. 概念与理解2.2. Householder矩阵求解方法2.3. Givens变换与Householder变换的关系三. 矩阵的QR...

shine的博客 3681

C++ 多线程并发 基础入门教程 1.3 条件变量(condition_variable), 信号量(semaphore)

C++11thread, condition_variable条件变量,binary_semaphore条件信号量,counting_semaohore计数信号量的简单使用

qq_46470984的博客 1631

同花顺自动化交易避坑指南:pywinauto实战中验证码识别与界面弹窗处理

本文深入探讨同花顺自动化交易中的关键稳定性问题,重点解决验证码识别与弹窗处理两大难题。通过优化Tesseract OCR、整合打码平台API以及设计pywinauto弹窗监控体系,提供了一套完整的自动化交易解决方案,帮助交易者有效规避资金账户和持仓信息操作中的常见陷阱。

weixin_33734785的博客 488

C++多线程基础: 并发条件变量std::condition_variable

#include <iostream> // std::cout #include <thread> // std::thread #include <mutex> // std::mutex, std::unique_lock #include <condition_variable> // std::condition_variable std::mutex .

在么升龙拳的博客 246

水下井口装置及钻杆建模

内容:海上油气资源开采的过程中,通常会由海上钻井平台下入钻杆连接到海底井口装置。OrcaFlex软件可进行各种海洋工程结构动态分析,通过各项数据的输入,能够很方便地进行水下井口装置及钻杆建模。直接使用软件New Line及new vessel功能,再设置模型的各项参数(几何属性、弯曲刚度、轴线刚度、扭转刚度、泊松比等)即可建成井口装置及钻杆模型。 设置管线的几何属性:主要包括管线的内外径、壁厚、...

s0302017的博客 1145

基于Simulink的电力电子系统电磁兼容性(EMC)仿真

在电力电子系统中,由于高频开关器件的存在,会产生大量的电磁干扰(EMI),这对系统的稳定性和可靠性提出了挑战。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电力电子系统的电磁兼容性。本教程将详细介绍如何使用 Simulink 进行电力电子系统的电磁兼容性仿真。通过本教程,我们详细介绍了如何使用 Simulink 进行电力电子系统的电磁兼容性仿真。为了模拟电力电子系统中的电磁干扰(EMI),我们需要添加噪声源模块。为了更好地分析系统的电磁兼容性特性,可以在模型中添加频谱分析工具。

amy_mhd的博客 1126

C++11多线程部分知识点 + 多线程顺序执行 + 交替打印字符串

c++11 多线程编程部分知识介绍,以及实现多线程顺序执行和交替打印数值

Ray Home 4607

京东运维面试题及参考答案

cgroup(Control Group)是 Linux 内核提供的一种可以限制、控制与分离一个进程组群的资源(如 CPU、内存、磁盘 I/O 等)的机制。通过 cgroup,可以为不同的进程或进程组分配特定的资源配额,实现资源的隔离和管理。比如,在一个服务器上运行多个容器时,可以使用 cgroup 来限制每个容器对 CPU 和内存的使用,防止某个容器占用过多资源而影响其他容器的运行。cgroup 还可以对进程进行优先级设置,确保关键进程能够优先获得资源。

大模型大数据攻城狮的专栏 1236

C++ 多线程编程入门基础

        好消息好消息,C++98里没有的线程库C++11里终于有了!!!不要9.9元,只要包含头文件thread,就可免费使用它,赶紧打开你的IDE开始多线程编程吧!                         1、join()               &nb

WYuan的博客 543

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c++并发编程和多线程处理

开发者可以通过使用互斥锁、条件变量和原子操作等机制,来保证自己编写的代码在多线程环境中的线程安全性。在设计和实现多线程程序时,需要仔细考虑和分析线程安全性问题,并采取适当的同步机制来确保安全性。尽管C++提供了多线程支持,但并发编程仍然具有一定的复杂性和挑战。正确地处理线程同步、线程间通信和数据共享是确保多线程程序正确运行的关键。

zhengddzz的博客 2023

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++多线程编程基础

C++多线程编程基础

qq_36458461的博客 739

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【C++】多线程

本节主要讲解了C++ 多线程的 创建, 互斥变量, 条件变量以及原子操作

yf214wxy的博客 5970

C++多线程基础入门

C++多线程基础入门

m0_73443478的博客 165

c++多线程库手册学习笔记(一)

好久不写博客了,一方面是觉得比较花时间,另一方面觉得也没啥好写的,不过最近看cppreference上关于c++多线程的支持,觉得有必要整理整理,就来写一写好了。 一、基本的多线程需要的东西: 对于多线程代码而言,我觉得最基本需要有以下一些类型: thread类型 互斥锁mutex 条件变量condition_variable thread类型用来跟踪管理一个线程,互斥锁提供多个线程共享资源的...

成成赐我力量 496

C++多线程编程

在 C++ 中,多线程编程可以用来提高程序的性能,尤其是当程序涉及到计算密集型或 I/O 密集型任务时。C++11 引入了对多线程的直接支持,使得创建和管理线程变得更为简便。

fakerth的博客 1068

C++多线程编程简介

多线程编程允许在同一个程序中同时执行多个任务,从而提高程序的效率,特别是在处理 I/O 密集型或计算密集型任务时。C++11 引入了标准库中的多线程支持,使得 C++ 开发者能够更加方便地进行多线程编程。

程子鱼 1252

C++多线程同步

摘要:本文介绍了C++11中如何开启新线程,并详细讲解了线程的基础同步原语:mutex, lock_guard, unique_lock, condition variable和semaphore等。如何采用async, packaged_task和promise实现future同步机制?怎样处理spurious wakeup?本文以质数判定服务为例为大家分享C++多线程同步措施! 1. C++线程和基础同步原语 Thread mutex, lock_guard, unique_lock con.

书山有路勤为径 5529

C++11多线程概论

多线程的的编译命令: g++ -std=c++11 -o condition_variable condition_variable.cpp -lpthread 要加上-lpthread  lpthread这个类用到posix实现的线程了。 C++11新标准中引入了四个头文件来支持多线程变成,他们分别是&lt;atomic&gt;,&lt;thread&gt;,&lt;mutex&gt;,&...

zhong29的博客 497

LeetCode 1114. 按序打印(零基础也能看懂的多线程)

给你一个类:三个不同的线程 A、B、C 将会共用一个Foo实例。first()second()third()请设计修改程序,以确保second()方法在first()方法之后被执行,third()方法在second()方法之后被执行。有三个线程会被异步启动。输入 [1,2,3] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 second() 方法,线程 C 将会调用 third() 方法。正确的输出是 "firstsecondthird"。

2504_93605592的博客 1944

C++多线程相关

beginthreadex()​​ 和 ​​_endthreadex()​​ 是 ​​C运行时库(CRT)​​ 提供的线程管理函数,用于创建和终止线程,并自动初始化与C运行时相关的资源(如线程局部存储、errno 等)。1. 线程是在thread对象被定义的时候开始执行的,而不是在调用join()函数时才执行的,调用join()函数只是阻塞等待线程结束并回收资源。过小的栈可能导致栈溢出,过大会浪费内存。2. 分离的线程(执行过detach()的线程)会在调用它的线程结束或自己结束时自动释放资源。

u012374012的专栏 753

c++多线程

从thread\mutex\atomic\condition_variable\semaphore到promise\future、package_task\async、到生产者消费者模型,最后到线程池。

布都御魂x的博客 922
上一篇: C++多线程基础-atomic
下一篇: #pragma pack结构体对齐
KPer_Yang
博客等级 码龄5年 281粉丝 181原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KPer_Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值