C++11多线程编程-两个进程轮流打印1~100
这是经典的同步互斥问题,
遵循原则:
1、条件变量需要锁的保护;
2、锁需要条件变量成立后,后重新上锁;
参考代码:
//notify_one()(随机唤醒一个等待的线程)
//notify_all()(唤醒所有等待的线程)
//Create By@herongwei 2019/09/10#include <bits/stdc++.h>
#include <mutex>
#include <thread>
#include <condition_variable>
using namespace std;std::mutex data_mutex;//互斥锁
std::condition_variable data_var;//条件变量
bool flag = true;
void printfA() {int i = 1;while(i <= 100) {//休息1秒//std::this_thread::sleep_for(std::chrono::seconds(1));std::unique_lock<std::mutex> lck(data_mutex);data_var.wait(lck,[]{return flag;});//等待flag=true才打印奇数std::cout<<"A " << i <<endl;i += 2;flag = false;data_var.notify_one();}
}void printfB() {int i = 2;while(i <= 100) {std::unique_lock<std::mutex> lck(data_mutex);data_var.wait(lck,[]{return !flag;});//等待flag=false才打印偶数std::cout<<"B " << i <<endl;i += 2;flag = true;data_var.notify_one();}
}
int main() {// freopen("in.txt","r",stdin);std::thread tA(printfA);std::thread tB(printfB);tA.join();tB.join();return 0;
}
思路2:
C++ 11,VS2019
使用了unique_lock,条件变量
条件变量的wait(), notify_one()
wait()中使用了lambda表达式
代码
#include <iostream>
#include <vector>
#include <thread>
#include <list>
#include <mutex>
using namespace std;
bool flag = true;
class A
{
public:
void print1()
{
while (true)
{
std::unique_lock<std::mutex> lock1(print_mutex);
data_var.wait(lock1, [] {return flag; });
cout << "thread: " << std::this_thread::get_id() << " print: " << "A" << endl;
flag = false;
data_var.notify_one();
}
}
void print2()
{
while (true)
{
std::this_thread::sleep_for(std::chrono::seconds(1));
std::unique_lock<std::mutex> lock2(print_mutex);
data_var.wait(lock2, [] {return !flag; });
cout << "thread: " << std::this_thread::get_id() << " print: " << "B" << endl;
flag = true;
data_var.notify_one();
}
}
private:
std::mutex print_mutex;
std::condition_variable data_var;
};
int main()
{
A myobj_a;
std::thread print1(&A::print1, &myobj_a);
std::thread print2(&A::print2, &myobj_a);
print1.join();
print2.join();
return 0;
}
C++11多线程编程-两个进程轮流打印1~100相关推荐
- java go多线程:两个线程交替打印 0~100 的奇偶数
最近在实现raft算法,用到了很多go的高并发的知识,看到一道题写两个线程交替打印 1~100 的奇偶数,突然来了兴趣. 题目要求我们要启动两个线程,一个打印奇数,一个打印偶数.中途不能跳出协程. 代 ...
- Linux与C++11多线程编程(学习笔记)
多线程编程与资源同步 在Windows下,主线程退出后,子线程也会被关闭; 在Linux下,主线程退出后,系统不会关闭子线程,这样就产生了僵尸进程 3.2.1创建线程 Linux 线程的创建 #inc ...
- 线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数
作者:dadiyang来源:https://blog.csdn.net/dadiyang/article/details/88315124 面试场景 面试官:Java多线程了解吗?你给我写一下,起两个 ...
- c++11多线程编程同步——使用条件变量condition variable
简述 在多线程编程中,当多个线程之间需要进行某些同步机制时,如某个线程的执行需要另一个线程完成后才能进行,可以使用条件变量. c++11提供的 condition_variable 类是一个同步原语, ...
- c++11 多线程编程(一)------初始
什么是并发 并发在生活中随处可见,边走路边说话,边听歌边写代码.计算机术语中的"并发",指的是在单个系统里同时执行多个独立的活动,而不是顺序的一个接一个的执行.对于单核CPU来说, ...
- c++11 多线程编程(六)------条件变量(Condition Variable)
互斥锁std::mutex是一种最常见的线程间同步的手段,但是在有些情况下不太高效. 假设想实现一个简单的消费者生产者模型,一个线程往队列中放入数据,一个线程往队列中取数据,取数据前需要判断一下队列中 ...
- c++11 多线程编程(三)------ 竞争和互斥锁
竞争条件 并发代码中最常见的错误之一就是竞争条件(race condition).而其中最常见的就是数据竞争(data race),从整体上来看,所有线程之间共享数据的问题,都是修改数据导致的,如果所 ...
- C++11多线程编程--线程创建
参考资料 adam1q84 我是一只C++小小鸟 Thread support library Book:<C++ Concurrency in Action> 线程的创建 线程的创建有多 ...
- c++11 多线程编程(五)------unique_lock
互斥锁保证了线程间的同步,但是却将并行操作变成了串行操作,这对性能有很大的影响,所以我们要尽可能的减小锁定的区域,也就是使用细粒度锁. 这一点lock_guard做的不好,不够灵活,lock_guar ...
最新文章
- php 遍历所有的文件
- PHP的安装与设置——windos
- BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞
- linux线程切换回调函数,linux C线程退出回调函数
- 人脸识别运行之前需要处理的问题
- 从 Web 图标演进历史看最佳实践
- 本地差分隐私 随机响应_大数据时代下的隐私保护(二)
- 正则表达式 (入门)
- 拆分php中 $i++ ++$i PHP中的i++与++i的区别及效率
- H3C防火墙透明模式部署trunk
- ROS智能车自主导航roslaunch racecar_gazebo racecar_runway_navigation.launch报错
- WiFi通信模块框图
- Failed to compile with 1 errors
- luogu4061 大吉大利,晚上吃鸡!
- XSS修炼之独孤九剑——笔记
- 微信小程序——商品列表
- 10676 涂鸦跳跃(sort)
- ssd(Single Shot MultiBox Detector)解读之(一)原理解析
- 微型计算机m3500q,联想ThinkCentre M3500q超小商用台式机
- 嵌入式的可就业方向有哪些?
热门文章
- C# IO操作(五)文件的递归加载
- CentOS上 Mono 3.2.8运行ASP.NET MVC4经验
- 转:Jbpm4.2 tomcat6 oracle9i安装过程
- .NET C/S(WinForm)开发技巧点滴(转)
- 小学计算机室教室的简报,高新区第三小学开展“信息技术与教育教学融合创新发展”培训...
- [网络安全自学篇] 五十八.Windows安全缺陷利用之再看CVE-2019-0708及反弹shell防御措施
- [Python微信开发] 一.itchat入门知识及微信自动回复、微信签名词云分析
- HarmonyOS之应用开发的电话服务与蜂窝网络
- 2013\National _C_C++_B\4.高僧斗法
- Jenkins 创建Maven项目