c++多线程交替输出

2024-08-31 03:36
文章标签 输出 c++ 多线程 交替

本文主要是介绍c++多线程交替输出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*
写一个程序:
三个线程交替输出
输入一个数n,例如:
n=4,需要输出队列:01020304
n=5, 需要输出队列:0102030405
线程zero输出0,线程odd输出奇数,线程even输出偶数
注意线程zero一定要等其他两个线程先启动,否则就会出现死锁。
防止多输出0:当odd和even线程都退出了,就没必要继续输出了
*/

#include <bits/stdc++.h>class Printer {
public:Printer(int n) : n(n), i(1), start_odd(false), start_even(false) {}void zero(std::function<void(int)> print) {while (!(this->start_odd && this->start_even)) {;}print(0);while (true) {if (i & 1) {cv_odd.notify_one();} else {cv_even.notify_one();}{std::unique_lock<std::mutex> lock(mtx);cv_zero.wait(lock);}if (!start_even && !start_odd) {break;}print(0);}};void odd(std::function<void(int)> print) {while (true) {{std::unique_lock<std::mutex> lock(mtx);start_odd = true;cv_odd.wait(lock);}if (i > n) {cv_zero.notify_one();break;}print(i);i++;cv_zero.notify_one();if (i + 1 > n) {start_odd = false;break;}}};void even(std::function<void(int)> print) {while (true) {{std::unique_lock<std::mutex> lock(mtx);start_even = true;cv_even.wait(lock);}if (i > n) {cv_zero.notify_one();break;}print(i);i++;cv_zero.notify_one();if (i + 1 > n) {start_even = false;break;}}};private:int n;int i;bool start_odd, start_even;std::mutex mtx;std::condition_variable cv_zero, cv_odd, cv_even;
};void print_func(int x) {std::cout << x;
}int main() {int n;std::cin >> n;Printer printer(n);std::thread t1(&Printer::odd, &printer, print_func);std::thread t0(&Printer::zero, &printer, print_func);std::thread t2(&Printer::even, &printer, print_func);t0.join();t1.join();t2.join();return 0;
}

这篇关于c++多线程交替输出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1122770

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

java -jar example.jar 产生的日志输出到指定文件的方法

《java-jarexample.jar产生的日志输出到指定文件的方法》这篇文章给大家介绍java-jarexample.jar产生的日志输出到指定文件的方法,本文给大家介绍的非常详细,对大家的... 目录怎么让 Java -jar example.jar 产生的日志输出到指定文件一、方法1:使用重定向1、