[C++] 一个线程打印奇数一个线程打印偶数

要求开辟两个线程打印从0-100的数,一个线程打印奇数一个线程打印偶数,要求必须按照1,2,3,4,5,6…100这种按照顺序打印

  1. 使用std::shared_mutex的版本
#ifndef PrintNumber2_H_
#define PrintNumber2_H_#include <shared_mutex>class PrintNumber2 {
public:void PrintOdd();void PrintEven();
private:int m_num = 1;std::shared_mutex m_mutex;
};#endif#include "PrintNumber2.h"
#include <iostream>void PrintNumber2::PrintOdd()
{while (true) {m_mutex.lock_shared();if (m_num <= 100) {if (m_num % 2 == 1) {m_mutex.unlock_shared();std::cout << "奇线程 :" << m_num << std::endl;m_mutex.lock();++m_num;m_mutex.unlock();}else {m_mutex.unlock_shared();}}else {m_mutex.unlock_shared();break;}}
}void PrintNumber2::PrintEven()
{while (true) {m_mutex.lock_shared();if (m_num <= 100) {if (m_num % 2 == 0) {m_mutex.unlock_shared();std::cout << "偶线程 :" << m_num << std::endl;m_mutex.lock();++m_num;m_mutex.unlock();}else {m_mutex.unlock_shared();}}else {m_mutex.unlock_shared();break;}}
}

main.cpp

#include <iostream>
#include <thread>
#include "PrintNumber.h"
#include "PrintNumber2.h"int main()
{//PrintNumber printNumber;//std::thread thread1(&PrintNumber::printOdd, &printNumber);//std::thread thread2(&PrintNumber::printEven, &printNumber);//thread1.join();//thread2.join();PrintNumber2 printNumber;std::thread thread1(&PrintNumber2::PrintOdd, &printNumber);std::thread thread2(&PrintNumber2::PrintEven, &printNumber);thread1.join();thread2.join();return 0;
}

升级版本

#include "PrintNumber2.h"
#include <iostream>void PrintNumber2::PrintOdd()
{while (true) {std::shared_lock<std::shared_mutex> sharedLock(m_mutex);if (m_num <= 100) {if (m_num % 2 == 1) {sharedLock.unlock();std::cout << "奇线程 :" << m_num << std::endl;std::lock_guard<std::shared_mutex> lockGuard(m_mutex);++m_num;}else {sharedLock.unlock();}}else {break;}}
}void PrintNumber2::PrintEven()
{while (true) {std::shared_lock<std::shared_mutex> sharedLock(m_mutex);if (m_num <= 100) {if (m_num % 2 == 0) {sharedLock.unlock();std::cout << "偶线程 :" << m_num << std::endl;std::lock_guard<std::shared_mutex> lockGuard(m_mutex);++m_num;}else {sharedLock.unlock();}}else {break;}}
}

使用条件变量版本(可以避免空转耗费cpu)

#include "PrintNumber.h"
#include <iostream>void PrintNumber::printOdd()
{while (true) {std::unique_lock<std::mutex> lock(m_mutex);m_cv.wait(lock, [this]() {return m_isOddTurn || m_num > 100; });if (m_num > 100) {break;}std::cout << "奇线程 : " << m_num << std::endl;++m_num;m_isOddTurn = false;m_cv.notify_all();}
}void PrintNumber::printEven()
{while (true) {std::unique_lock<std::mutex> lock(m_mutex);m_cv.wait(lock, [this]() {return !m_isOddTurn || m_num > 100; });if (m_num > 100) {break;}std::cout << "偶线程 : " << m_num << std::endl;++m_num;m_isOddTurn = true;m_cv.notify_all();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL全量、增量备份与恢复

目录 数据备份 一、数据备份类型 二、常见备份方法 扩展&#xff1a;GTID与XtraBackup ‌一、GTID&#xff08;全局事务标识符&#xff09;‌ ‌1. 定义与核心作用‌ ‌2. GTID在备份恢复中的意义‌ ‌3. GTID配置与启用‌ ‌二、XtraBackup的意义与核心价值‌ ‌1. 定…

木马查杀篇—Opcode提取

【前言】 介绍Opcode的提取方法&#xff0c;并探讨多种机器学习算法在Webshell检测中的应用&#xff0c;理解如何在实际项目中应用Opcode进行高效的Webshell检测。 Ⅰ 基本概念 Opcode&#xff1a;计算机指令的一部分&#xff0c;也叫字节码&#xff0c;一个php文件可以抽取出…

DeepSeek-R1-Distill-Qwen-1.5B代表什么含义?

DeepSeek‑R1‑Distill‑Qwen‑1.5B 完整释义与合规须知 一句话先行 这是 DeepSeek‑AI 把自家 R1 大模型 的知识&#xff0c;通过蒸馏压缩进一套 Qwen‑1.5B 架构 的轻量学生网络&#xff0c;并以宽松开源许可证发布的模型权重。 1 | 名字逐段拆解 片段意义备注DeepSee…

Megatron系列——张量并行

本文整理自bilibili Zomi视频 1、行切分和列切分 注意&#xff1a; &#xff08;1&#xff09;A按列切分时&#xff0c;X无需切分&#xff0c;split复制广播到A1和A2对应设备即可。最后Y1和Y2需要拼接下&#xff0c;即All Gather &#xff08;2&#xff09;A按行切分时&#…

java agent技术

从JDK1.5之后引入了java angent技术 Java Agent 是一种强大的技术&#xff0c;它允许开发者在 JVM 启动时或运行期间动态地修改类的字节码&#xff0c;从而实现诸如性能监控、日志记录、AOP&#xff08;面向切面编程&#xff09;等功能 java agent依赖于Instrumentation API&…

LLaMA Factory 深度调参

注意&#xff0c;本文涵盖从基础调参到前沿研究的完整知识体系&#xff0c;建议结合具体业务场景灵活应用。一篇“参考文献”而非“可运行的代码”。https://github.com/zysNLP/quickllm 初始指令&#xff1a; llamafactory-cli train \--stage sft \--do_train True \--mode…

Linux驱动:驱动编译流程了解

要求 1、开发板中的linux的zImage必须是自己编译的 2、内核源码树,其实就是一个经过了配置编译之后的内核源码。 3、nfs挂载的rootfs,主机ubuntu中必须搭建一个nfs服务器。 内核源码树 解压 tar -jxvf x210kernel.tar.bz2 编译 make x210ii_qt_defconfigmakeCan’t use ‘…

Redis集群模式、持久化、过期策略、淘汰策略、缓存穿透雪崩击穿问题

Redis四种模式 单节点模式 架构​​&#xff1a;单个Redis实例运行在单台服务器。 ​​优点​​&#xff1a; ​​简单​​&#xff1a;部署和配置容易&#xff0c;适合开发和测试。 ​​低延迟​​&#xff1a;无网络通信开销。 ​​缺点​​&#xff1a; ​​单点故障​​&…

1.2 函数

函数的本质是描述变量间的依赖关系&#xff1a;​​一个变量&#xff08;自变量&#xff09;的变化会唯一确定另一个变量&#xff08;因变量&#xff09;的值​​。 ​​基本构成​​&#xff1a;通过符号&#xff08;如YF(X)&#xff09;表达规则&#xff0c;X输入 → F处理 …

2025数字孪生技术全景洞察:从工业革命到智慧城市的跨越式发展

引言 数字孪生技术&#xff0c;这一融合物理世界与虚拟镜像的革新性工具&#xff0c;正以惊人的速度重塑产业格局。2025年&#xff0c;中国数字孪生市场规模预计达214亿元&#xff0c;工业制造领域占比超40%&#xff0c;其技术深度与行业落地成果令人瞩目。本文将结合最新数据与…

RabbitMQ 工作模式

RabbitMQ 一共有 7 中工作模式&#xff0c;可以先去官网上了解一下&#xff08;一下截图均来自官网&#xff09;&#xff1a;RabbitMQ 官网 Simple P&#xff1a;生产者&#xff0c;要发送消息的程序&#xff1b;C&#xff1a;消费者&#xff0c;消息的接受者&#xff1b;hell…

VBA会被Python代替吗

VBA不会完全被Python取代、但Python在自动化、数据分析与跨平台开发等方面的优势使其越来越受欢迎、两者将长期并存且各具优势。 Python以其易于学习的语法、强大的开源生态系统和跨平台支持&#xff0c;逐渐成为自动化和数据分析领域的主流工具。然而&#xff0c;VBA依旧在Exc…

【开源工具】深度解析:基于PyQt6的Windows时间校时同步工具开发全攻略

&#x1f552; 【开源工具】深度解析&#xff1a;基于PyQt6的Windows时间校时同步工具开发全攻略 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热…

大模型项目:普通蓝牙音响接入DeepSeek,解锁语音交互新玩法

本文附带视频讲解 【代码宇宙019】技术方案&#xff1a;蓝牙音响接入DeepSeek&#xff0c;解锁语音交互新玩法_哔哩哔哩_bilibili 目录 效果演示 核心逻辑 技术实现 大模型对话&#xff08;技术&#xff1a; LangChain4j 接入 DeepSeek&#xff09; 语音识别&#xff08;…

qt命名空间演示

#ifndef CIR_H #define CIR_Hnamespace cir {double PI3.141592653;//获取圆行周长double getLenthOfCircle(double radius){return 2*PI*radius;}//获取圆形面积double getAreaOfCircle(double radius){return PI*radius*radius;}} #endif // CIR_H#include <iostream> …

使用 Java 反射动态加载和操作类

Java 的反射机制(Reflection)是 Java 语言的一大特色,它允许程序在运行时检查、加载和操作类、方法、字段等元信息。通过 java.lang.Class 和 java.lang.reflect 包,开发者可以动态加载类、创建实例、调用方法,甚至在运行时构造新类。反射是 Java 灵活性的核心,广泛应用于…

《 C++ 点滴漫谈: 三十七 》左值?右值?完美转发?C++ 引用的真相超乎你想象!

摘要 本文全面系统地讲解了 C 中的引用机制&#xff0c;涵盖左值引用、右值引用、引用折叠、完美转发等核心概念&#xff0c;并深入探讨其底层实现原理及工程实践应用。通过详细的示例与对比&#xff0c;读者不仅能掌握引用的语法规则和使用技巧&#xff0c;还能理解引用在性能…

【AutoGen深度解析】下一代AI代理编程框架实战指南

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1f6a7; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f50d; 一、技术原理剖析&#x1f5bc;️ 核心概念图解&#x1f4a1; 核心作用讲解⚙️ 关键技术模块说明&#x1f504; 技术…

Python-AI调用大模型 给出大模型人格案例

Python调用通义千问模拟原神雷电将军口吻 最近在用AI编辑器写AI对话 尝试给AI对话增加人格 以下是使用阿里通义千问大模型模拟《原神》中雷电将军(雷电影)口吻的代码案例&#xff0c;包含典型的高傲威严、略带古风的说话风格。 完整后端代码示例 import dashscope from dash…

csdn博客打赏功能

CSDN_专业开发者社区_已接入DeepSeekR1满血版 官网: 最右下角 耳机 就是客服 可以转人工 开启打赏功能如下: 1.因为博主本人不可以对本人账号文章进行打赏&#xff0c;因此本人账号打开文章详情页不显示打赏按钮。为了验证账号设置的打赏功能是否生效所以让您使用无痕模式模…