C++条件变量

概述

条件变量的使用,其实是一种多线程通知模式,当线程一使用完数据后,通过条件变量通知其他线程,C++11后开始支持。

说明

条件变量必须配合mutex使用,确保并发访问的排他性

std::unique_lock<std::mutex> lock(m);

线程让自我挂起,释放锁, 等待条件匹配

若next == index为false则线程挂起,释放锁,直到被唤醒;唤醒后再判断next == index,若为false则继续挂起,直到被唤醒同时条件为true。

   

 cv.wait(lock, [=]{return next == index; });...

发送通知以唤醒等待队列中所有线程
   

cv.notify_all();

主线程等待线程结束

     

t.join

其他条件变量函数
notify_one                    通知一个等待的线程
notify_all                      通知所有等待的线程
wait                              阻塞当前线程,直到条件变量被唤醒
wait_for                        阻塞当前线程,直到条件变量被唤醒,或到指定时限时长后
wait_until                      阻塞当前线程,直到条件变量被唤醒,或直到抵达指定时间点
native_handle               返回原生句柄

     

测试代码

#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
#include <vector>std::mutex m;
std::condition_variable cv;
std::vector<int> result;
int next = 0;void worker(int index) {for (int i = 0; i < 10; i++) {std::unique_lock<std::mutex> lock(m);cv.wait(lock, [=]{return next == index; });std::cout << "worker " << index << "\n";result.push_back(index);next = next + 1;if (next > 2) { next = 1; };cv.notify_all();}
}int main() {std::thread worker1(worker, 1);std::thread worker2(worker, 2);{std::lock_guard<std::mutex> l(m);next = 1;}std::cout << "Start\n";cv.notify_all();worker1.join();worker2.join();for (int e : result) {std::cout << e << ' ';}std::cout << std::endl;
}

运行结果


我公司承接各类技术服务,主要聚焦于:stm32、单片机、嵌入式、QT应用开发、Web+Python+Django应用开发。欢迎合作。

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

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

相关文章

【投稿优惠|快速见刊】2024年图像,机器学习和人工智能国际会议(ICIMLAI 2024)

【投稿优惠|快速见刊】2024年图像&#xff0c;机器学习和人工智能国际会议&#xff08;ICIMLAI 2024&#xff09; 重要信息 会议官网&#xff1a;http://www.icimlai.com会议地址&#xff1a;深圳召开日期&#xff1a;2024.03.30截稿日期&#xff1a;2024.03.20 &#xff08;先…

node.js和electron安装

文章目录 一、node.js安装1.node.js下载安装2.设置镜像 二、其它问题1.文件夹创建错误2.electron安装错误 一、node.js安装 1.node.js下载安装 参考B站视频node.js安装&#xff0c;没有按视频中设置镜像 2.设置镜像 参考&#xff1a;https://npmmirror.com/ npm config se…

Composer基础使用 SDK包初始化

Composer 的工作原理 我们在使用 Composer 之前我们得了解一下它的实现原理&#xff0c;它主要由三个部分组成&#xff1a;命令行工具、包仓库、代码库&#xff1a; Packagist 它是官方仓库&#xff0c;也就是我们平常说的 Composer 源&#xff0c;它的作用是存储这些包的信息…

【C语言】常见的动态内存管理错误

前言 上一篇介绍了C语言中 动态内存管理函数&#xff0c;本片讲解的是 在我们使用动态内存管理时 常见的错误&#xff0c;一起来看看吧~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 1.对NULL指针的解引⽤操作 错…

浅谈 Linux 孤儿进程和僵尸进程

文章目录 前言孤儿进程僵尸进程 前言 本文介绍 Linux 中的 孤儿进程 和 僵尸进程。 孤儿进程 在 Linux 中&#xff0c;就是父进程已经结束了&#xff0c;但是子进程还在运行&#xff0c;这个子进程就被称作 孤儿进程。 需要注意两点&#xff1a; 孤儿进程最终会进入孤儿院…

Hgame题解(第二星期)

Hgame题解&#xff08;第二星期&#xff09; Web Select More Courses 打开靶机发现是一个登陆页面&#xff0c;根据题目提示下载弱密码字典&#xff0c;通过BP爆破获得用户密码为qwert123 登陆后进入下一个页面&#xff0c;由于学分已满无法选课&#xff0c;所以需要先进行…

40多岁失业的中年人,生活出路在哪里?

如果您是40岁失业的中年人&#xff0c;以下是一些可能有用的建议&#xff1a; 1. 寻找新的就业机会。尽管失业可能很挫败&#xff0c;但是现在可能是一个新开始的时机。您可以更新您的简历和求职信&#xff0c;联系前雇主或同行业的公司&#xff0c;或考虑重新培训获取相关技能…

【MySQL】数据查询——DQL基本数据库查询

目录 查询语法1. 查询表中所有的数据行和列&#xff0c;采用“*”符号2. 查询表中指定列的数据。3. 在查询中使用别名&#xff0c;使用“AS”关键字。4. 在查询中使用常量列&#xff1a;如果需要将一些常量的默认信息添加到输出结果中&#xff0c;以方便统计或计算。可以使用常…

备战蓝桥杯Day21 - 堆排序的内置模块+topk问题

一、内置模块 在python中&#xff0c;堆排序已经设置好了内置模块&#xff0c;不想自己写的话可以使用内置模块&#xff0c;真的很方便&#xff0c;但是堆排序算法的底层逻辑最好还是要了解并掌握一下的。 使用heapq模块的heapify()函数将列表转换为堆&#xff0c;然后使用he…

Highest Price in Supply Chain (25)

1、题目&#xff1a; A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;经销商&#xff09;, and suppliers&#xff08;供应商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting …

Spring MVC 和 Spring Cloud Gateway不兼容性问题

当启动SpringCloudGateway网关服务的时候&#xff0c;没注意好依赖问题&#xff0c;出现了这个问题&#xff1a; Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway. 解决办法就是&#xff1a;删除SpringMVC的依赖&#xff0c;即下列依赖。 &…

蓝桥杯练习系统(算法训练)ALGO-996 车的放置

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 在一个n*n的棋盘中&#xff0c;每个格子中至多放置一个车&#xff0c;且要保证任何两个车都不能相互攻击&#xff0c;有多少…