【C++】多线程的学习笔记(3)——白话文版(bushi

前言

好久没有继续写博客了,原因就是去沉淀了一下偷懒了一下

现在在学网络编程,c++的多线程也还在学

这一变博客就讲讲c++中的Condition Variable库吧

Condition Variable的简介

官方原文解释

翻译就是

条件变量 是一个对象,它能够阻止调用线程,直到通知 恢复。

当调用线程的一个*等待函数* 时,它使用 (mutex ) 来锁定线程。该线程将保持阻塞状态,直到被另一个线程唤醒,该线程对同一对象调用*通知函数*。

这里我们可以看到Condition Variable一般是要和mute锁配合使用来发挥他的最大用处

Condition Variable的使用方法

wait方法

wait方法的原型为两种

cpp 复制代码
void wait (unique_lock<mutex>& lck);
template <class Predicate>
void wait (unique_lock<mutex>& lck, Predicate pred);

第一种为他只是传递一个mutex锁(注意是unique_lock锁)来锁定自己,也就是堵塞当前的线程,直到自己被notify(下面要讲到的函数)唤醒。

第二种和第一种差不多不过他多了一个predicate的参数,这里可以是一个函数,类型为true或者false,我画了一张并不是很准确的图片可以帮助理解一下

大部分时候为了缩短代码的长度他一般会写出lambda表达式,也就是类似与[x] () { x=1; };这样的表达式

它可以等效为

cpp 复制代码
bool F_1(int x){
    return x=1
}

其中的lambda表达式有许多用法------诸如捕获前面的变量,传递以及引用;这里不多做赘述,论坛里有许多相关的文章,这里提一嘴主要是让读者知道这是一个什么东西,好搜索相应的教程。

wait for函数与wait until函数

wait for函数原型

cpp 复制代码
template <class Clock, class Duration>
    cv_status wait_until (unique_lock<mutex>& lck,const chrono::time_point<Clock,Duration>& abs_time);
template <class Clock, class Duration, class Predicate>
    bool wait_until (unique_lock<mutex>& lck,const chrono::time_point<Clock,Duration>& abs_time,Predicate pred);

这里不用仔细看,大部分和前面的wait函数一样,也是有两个函数(一个带predicate的参数,一个不带predicate的参数),但是多了一个设定超时时间,也就是超过时间即使没有获取到mutex锁就不堵塞当前线程了。

第二个参数可以设定一个超时时间比如2秒。

而wait until函数为

cpp 复制代码
template< class Clock, class Duration >
std::cv_status
    wait_until( std::unique_lock<std::mutex>& lock,
                const std::chrono::time_point<Clock, Duration>& timeout_time );

template< class Clock, class Duration, class Pred >
bool wait_until( std::unique_lock<std::mutex>& lock,
                 const std::chrono::time_point<Clock, Duration>& timeout_time,
                 Pred pred );

区别与wait until的是wait_until是取一个时间点

notify函数

notify函数分为notify_one以及notify_all

notify_one

notify_one为随机唤醒一个被阻塞的线程(注意为随机)

notify_all

notify_all为唤醒所有的被阻塞的线程

注意

需要注意的是notify唤醒后如果线程被唤醒后依然不满足继续执行下去的条件那么线程又会被重新堵塞。

小结

本章主要简单讲解了Condition Variable的用法以及途径他是一种可以让项目异步执行的一个操作,使得程序有一个很好得到性能。

相关推荐
Heartache boy23 分钟前
野火STM32_HAL库版课程笔记-DWT应用与DHT11温湿度传感器
笔记·stm32·单片机·嵌入式硬件
hmbbcsm7 小时前
关于transformors库的学习笔记
笔记·学习
xqqxqxxq8 小时前
Java AI智能P图工具技术笔记
java·人工智能·笔记
顾温8 小时前
default——C#/C++
java·c++·c#
FakeOccupational8 小时前
【电路笔记 PCB】Altium Designer : AD20信号完整性(Signal Integrity)分析+单线路传输分析+串扰分析(暂记)
笔记
凉茶钱8 小时前
【c语言】动态内存管理:malloc,calloc,realloc,柔性数组
c语言·c++·vscode·柔性数组
脏脏a8 小时前
【C++模版】泛型编程:代码复用的终极利器
开发语言·c++·c++模版
island13148 小时前
【C++仿Muduo库#3】Server 服务器模块实现上
服务器·开发语言·c++
散峰而望8 小时前
【算法竞赛】C/C++ 的输入输出你真的玩会了吗?
c语言·开发语言·数据结构·c++·算法·github
小龙报8 小时前
【C语言】内存里的 “数字变形记”:整数三码、大小端与浮点数存储真相
c语言·开发语言·c++·创业创新·学习方法·visual studio