[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.pswp.cn/news/905164.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905164.shtml
英文地址,請注明出處:http://en.pswp.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;因此本人賬號打開文章詳情頁不顯示打賞按鈕。為了驗證賬號設置的打賞功能是否生效所以讓您使用無痕模式模…