条件变量condition_variable用法学习

news/2024/10/6 3:53:15/文章来源:https://www.cnblogs.com/BlueBlueSea/p/18288457

转自:https://www.cnblogs.com/fenghualong/p/13855360.html

1.介绍

 condition_variable类似于信号量机制,实现了线程的等待和唤醒。

  • wait() :阻塞等待的同时释放锁(原子操作),还可以添加阻塞判断函数,详见代码
  • notify_all() : 唤醒所有阻塞等待的线程
  • notify_one(): 唤醒某一个等待的线程

2.例子

锁+条件变量 实现等待唤醒。

#include <condition_variable>
#include <mutex>
#include <thread>std::mutex mylock;
std::condition_variable condVar;bool dataReady{false};void waitingForWork() {std::cout << "Waiting ..." << std::endl;std::unique_lock<std::mutex> l(mylock);  // 加了unique_lock锁condVar.wait(l, []{return dataReady;});           // (4)std::cout << "Running ..." << std::endl;
}void setDataReady() {{std::lock_guard<std::mutex> l{mylock};  // 加了lock_guard锁dataReady = true;}std::cout << "Data prepared, notify one" << std::endl;condVar.notify_one();                             // (3)
}int main(int argc, char const *argv[])
{std::cout << "==========Begin==========" << std::endl;std::thread t1(waitingForWork);                    // (1)std::thread t2(setDataReady);                      // (2)
t1.join();t2.join();std::cout << "===========End===========" << std::endl;cout<<endl;return 0;
}
// 运行结果
-> % ./main
==========Begin==========
Waiting ...
Data prepared, notify one
Running ...
===========End===========

如果不用锁和等待条件控制,可能会导致虚假唤醒和唤醒丢失问题。

3.用条件变量实现信号量

https://blog.csdn.net/qq_24447809/article/details/115906017

#pragma once
#include<mutex>
#include<condition_variable>
class semaphore {
public:semaphore(long count = 0) :count(count) {}void wait() {std::unique_lock<std::mutex>lock(mx);cond.wait(lock, [&]() {return count > 0; });--count;}void signal() {std::unique_lock<std::mutex>lock(mx);++count;cond.notify_one();}private:std::mutex mx;std::condition_variable cond;long count;
};

  

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

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

相关文章

game1

进入题目发现是一个游戏发现有一个score.php的发包 发现有分数等 对比不同分数的包发现sign值都有ZM后疑似为base64于是将分数改为较高的分,ZM+base64 尝试要补一个=得到flag

[CISCN 2019 初赛]Love Math

进入题目,直接源码 代码审计、看师傅wp有黑名单字符过滤,有白名单函数过滤 于是用编码绕过,利用eval函数执行命令,system(cat /flag.txt) base_convert(a,b,c) //将数值a按b进制转换为c进制 dechex //将10进制转成16进制 hex2bin() //16进制转成字符串 base_convert(37907…

babyweb国赛华东北

进入题目目录扫描 扫出ssrf.php 发现url尝试用file协议访问/flag.txt拿到flag

人脸识别签到系统一站式开发【基于Pyqt5的CS架构软件】

人脸识别签到系统:课堂签到,上班打卡,进出门身份验证。 功能:人脸录入,打卡签到,声音提醒,打卡信息导出,打包exe文件人脸识别签到系统 1、运用场景 课堂签到,上班打卡,进出门身份验证。 2、功能架构 人脸录入,打卡签到,声音提醒,打卡信息导出:3、技术栈 python3.8…

本地管理员

进入题目 随意输入密码发现提示ip,则尝试xff伪造ip右键检查发现base64编码 解码得猜测为用户admin密码 抓包发包得到flag

rust学习-记录第一个完成的rust算法题

给你一个下标从 0 开始的 8 x 8 网格 board ,其中 board[r][c] 表示游戏棋盘上的格子 (r, c) 。棋盘上空格用 . 表示,白色格子用 W 表示,黑色格子用 B 表示。 游戏中每次操作步骤为:选择一个空格子,将它变成你正在执行的颜色(要么白色,要么黑色)。但是,合法 操作必须满…

Grafana+Loki+Promtail 日志监控

目录前置工作用户组(按需创建)GrafanaLokiLoki 配置文件Promtail配置文件配置数据源创建仪表盘添加查询项 前置工作Centos 7 关闭防火墙 (systemctl stop firewalld) 独立的用户组(可以不创建)用户组(按需创建) # 创建用户组 groupadd grafana # 新建一个家目录为`/home/graf…

source

进入题目右键源码发现一个假的flag base64解码啥也不是 目录扫描发现.git源码泄露,假的flag.txt下载.git进入目录 查看历史版本一一查看各个版本改动找到flag

cookies

进入题目,提示cookies伪造查看url发现filename为base64加密,发现参数line尝试查看index.php,base64加密对参数line进行遍历得到源码 error_reporting(0); $file=base64_decode(isset($_GET[filename])?$_GET[filename]:""); $line=isset($_GET[line])?intval($_…

成绩查询

进入题目猜测为sql注入 直接sqlmap一把梭 数据库表内容得到flag

秋名山车神

进入题目没刷新一次数字改变一次 直接上脚本 注意正则表达式得到flag

xxx二手交易市场

进入题目注册账号登陆后点击头像发现可以上传图片 上传正常图片bp抓包发现为jpeg类型且base64加密修改为php类型知道文件上传路径 蚁剑连接得到flag