【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的用法以及途径他是一种可以让项目异步执行的一个操作,使得程序有一个很好得到性能。

相关推荐
懒惰的bit2 小时前
基础网络安全知识
学习·web安全·1024程序员节
李元豪3 小时前
【智鹿空间】c++实现了一个简单的链表数据结构 MyList,其中包含基本的 Get 和 Modify 操作,
数据结构·c++·链表
2401_858286113 小时前
L7.【LeetCode笔记】相交链表
笔记·leetcode·链表
UestcXiye4 小时前
《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
c++·计算机网络·ip·tcp
一丝晨光5 小时前
编译器、IDE对C/C++新标准的支持
c语言·开发语言·c++·ide·msvc·visual studio·gcc
Natural_yz5 小时前
大数据学习09之Hive基础
大数据·hive·学习
龙中舞王5 小时前
Unity学习笔记(2):场景绘制
笔记·学习·unity
Natural_yz5 小时前
大数据学习10之Hive高级
大数据·hive·学习
丶Darling.5 小时前
Day40 | 动态规划 :完全背包应用 组合总和IV(类比爬楼梯)
c++·算法·动态规划·记忆化搜索·回溯
奶味少女酱~5 小时前
常用的c++特性-->day02
开发语言·c++·算法