主要知识——多线程,条件变量,锁。
这里其实有一个难点,当然可以在看了代码之后再回头来看,就是对std::condition_variable::wait方法的理解。
这里解释一下,当执行wait方法时,锁是会被解开的以便别的线程使用资源,但是调用wait的线程会被阻塞直到别的线程调用notify等一系列方法,然后调用wait的线程会再次获取锁,用代码来表示就是:
//cv是条件变量,mtx为互斥量
unique_lock lock(mtx);
cv(lock)
cv.wait();
//cv.wait相当于
lock.unlock();
xxxxx//此刻即真正阻塞等待notify
lock.lock();
当然本例中还包含其他一些知识点,譬如unique_lock和lock_gurad的区别?thread的join函数?当然这些都是比较简单的,但是不能忘记这些基础。
具体的代码如下:
#include
#include
#include
#include std::mutex mtx;
std::condition_variable cv_a,cv_b;
bool printAFlag = true;
void func1(){
std::unique_lock lock(mtx);
for(int i=0;
i<20;
i++){
while(!printAFlag)
cv_a.wait(lock);
printAFlag=!printAFlag;
std::cout<<"a"< lock(mtx);
for(int i=0;
i<20;
i++){
while(printAFlag)
cv_b.wait(lock);
printAFlag=!printAFlag;
std::cout<<"b"<
【c++|c++多线程交替打印、条件变量、锁】程序运行结果截图:
文章图片
推荐阅读
- 个人日记|K8s中Pod生命周期和重启策略
- 学习分享|【C语言函数基础】
- C++|C++浇水装置问题
- 数据结构|C++技巧(用class类实现链表)
- C++|从零开始学C++之基本知识
- 步履拾级杂记|VS2019的各种使用问题及解决方法
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- 动态规划|暴力递归经典问题
- 麦克算法|4指针与队列
- 遇见蓝桥遇见你|小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题