力扣1116題:用C++實現多線程交替輸出零、偶數、奇數

力扣1116題:用C++實現多線程交替輸出零、偶數、奇數 力扣題解 多線程 C++ 互斥鎖 偶數 奇數 第1張

一、題目解讀

力扣1116題要求設計一個類,實現三個線程交替輸出數字:一個線程輸出連續的0,一個線程輸出連續的偶數,另一個線程輸出連續的奇數。輸入參數n為總輸出次數(每個線程各輸出n次),輸出需嚴格按照0-偶數-奇數的順序循環,直至所有線程完成指定次數。題目核心在于多線程間的精確協作與同步控制。

二、解題思路

通過條件變量與互斥鎖實現線程間的同步。關鍵在于設計狀態變量next_type(標記下一個輸出類型)與count(全局計數),結合cv.wait()的謂詞條件判斷線程喚醒時機。通過notify_all()確保所有等待線程重新檢查條件,避免死鎖或饑餓問題。

三、步驟解析

1. 初始化:構造函數中初始化n、count=1、zero_flag=true、next_type=0,確保首個輸出為0。

2. zero線程:循環n次,每次等待next_type=0,輸出0后更新next_type為后續類型(奇數或偶數),并通知其他線程。

3. even/odd線程:循環直至count > n或獲取對應類型權限。通過謂詞條件判斷是否激活(如偶數線程等待next_type=2或結束條件),輸出并更新狀態,最后通知所有線程。

4. 同步邏輯:利用unique_lock自動管理鎖,條件變量結合謂詞避免虛假喚醒,notify_all()保證所有線程重新評估條件。

四、代碼與注釋

class ZeroEvenOdd {
private:int n;          // 總輸出次數int count;      // 全局計數bool zero_flag; // 初始標記int next_type;  // 0: zero, 1: odd, 2: evenstd::mutex mtx; // 互斥鎖std::condition_variable cv; // 條件變量public:ZeroEvenOdd(int n) {this->n = n;       // 初始化參數count = 1;         // 從1開始計數zero_flag = true;  // 首個線程為0next_type = 0;     // 初始輸出類型}void zero(function<void(int)> printNumber) {for (int i = 0; i < n; ++i) {  // 循環n次unique_lock<mutex> lock(mtx); // 加鎖cv.wait(lock, [this]{ return next_type == 0; }); // 等待類型為0printNumber(0);              // 輸出0next_type = (count % 2 == 1)? 1 : 2; // 根據count奇偶決定后續類型cv.notify_all();              // 喚醒所有線程}}void even(function<void(int)> printNumber) {while (true) {unique_lock<mutex> lock(mtx);cv.wait(lock, [this]{ return next_type == 2 || count > n;  // 等待類型為2或結束條件});if (count > n) break;              // 結束循環printNumber(count++);               // 輸出偶數并遞增計數next_type = 0;                      // 重置類型cv.notify_all();}}void odd(function<void(int)> printNumber) {while (true) {unique_lock<mutex> lock(mtx);cv.wait(lock, [this]{ return next_type == 1 || count > n;  });if (count > n) break;printNumber(count++);next_type = 0;cv.notify_all();}}
};

五、總結

該解法巧妙利用條件變量與互斥鎖實現線程間的精確協作,通過狀態變量動態切換輸出類型,避免復雜的條件判斷。核心優勢在于:

1. 清晰的狀態轉移邏輯(next_type與count的協同);

2. 謂詞條件防止虛假喚醒,提升效率;

3. notify_all()確保所有線程響應,避免饑餓問題。

對多線程同步控制與力扣算法優化具有參考價值,適用于需要高并發協作的場景。

來源:力扣題解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93786.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93786.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93786.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言(07)——原碼 補碼 反碼 (超絕詳細解釋)

本文的內容通下面這篇文章有著緊密的聯系&#xff0c;讀者可以選擇性閱讀 C語言————二、八、十、十六進制的相互轉換-CSDN博客 相關的C語言練習題和思維鍛煉可以參考以下文章 C語言————練習題冊&#xff08;答案版&#xff09;-CSDN博客 C語言————斐波那契數列…

磁盤壞道檢測工具在美國服務器硬件維護中的使用規范

磁盤壞道檢測工具在美國服務器硬件維護中的使用規范在服務器硬件維護領域&#xff0c;磁盤壞道檢測工具是保障數據安全的第一道防線。本文將系統介紹美國數據中心環境下專業級磁盤診斷方案的實施標準&#xff0c;重點解析SMART檢測、壞道修復算法與自動化運維流程的整合方法&am…

【n8n】如何跟著AI學習n8n【03】:HTTPRequest節點、Webhook節點、SMTP節點、mysql節點

前言 n8n的系統性學習&#xff0c;對各知識點地毯式學習&#x1f50d;~ 前面課程 定制n8n的AI老師&#xff0c;有AI老師制定學習大綱&#xff0c;參考之前的文檔&#xff08;本系列n8n學習大綱&#xff0c;也在這里&#xff09;&#xff1a; 【n8n】如何跟著AI學習n8n_01&a…

Vue 的雙向數據綁定原理

Vue 的雙向數據綁定是通過 數據劫持 發布-訂閱模式 實現的&#xff0c;具體分為以下三個關鍵機制&#xff1a;1. 數據劫持&#xff08;響應式系統&#xff09; Vue 使用 Object.defineProperty&#xff08;Vue 2&#xff09;或 Proxy&#xff08;Vue 3&#xff09;監聽數據變化…

【基于C# + HALCON的工業視覺系統開發實戰】三十五、金屬表面劃傷檢測:強反光場景解決方案

摘要:針對金屬表面強反光導致劃傷檢測準確率低的行業痛點,本文提出基于光度立體法的工業視覺檢測方案。系統采用“硬件抗反光+算法重建”雙策略,硬件上通過可編程分區環形光源、偏振鏡頭與高動態相機構建成像系統;算法上利用四方向光源序列圖像重建表面法向量與高度場,實現…

為什么bert是雙向transformer

BERT 是雙向 Transformer&#xff0c;這是它的一個核心創新點。下面我從 技術原理、與傳統 Transformer 的區別、以及雙向性的實際意義 來詳細解釋為什么 BERT 被稱為“雙向 Transformer”。一、什么是 BERT 的“雙向”&#xff1f;在 BERT 的論文中&#xff0c;雙向的原文是 &…

vue中使用Canvas繪制波形圖和頻譜圖(支持.pcm)

實現方式一&#xff1a; vue中使用wavesurfer.js繪制波形圖和頻譜圖 安裝colorMap&#xff1a; npm install --save colormap1、單個頻譜圖 效果&#xff1a; 源碼&#xff1a; <template><div class"spectrogram-container"><canvas ref"ca…

【Python系列】Flask 應用中的主動垃圾回收

博客目錄一、Python 內存管理基礎二、Flask 中手動觸發 GC 的基本方法三、高級 GC 策略實現1. 使用裝飾器進行請求級別的 GC2. 定期 GC 的實現四、Flask 特有的 GC 集成方式1. 使用 teardown_request 鉤子2. 結合應用上下文管理五、智能 GC 策略六、注意事項與最佳實踐七、替代…

Linux和shell

最快入門的方式是使用蘋果系統。此外&#xff0c;累計補充學習&#xff1a;一、目錄結構/bin&#xff0c;二進制文件 /boot&#xff0c;啟動文件 /dev&#xff0c;設備文件 /home&#xff0c;主目錄&#xff0c;一般外接包、安裝包放在這里 /lib&#xff0c;庫文件 /opt&#x…

告別內存泄漏:你的Rust語言30天征服計劃

歡迎踏上Rust學習之旅&#xff01;第一周&#xff1a;奠定基礎 (Week 1: Laying the Foundation)第1天&#xff1a;環境搭建與 “Hello, World!”核心概念: 安裝Rust工具鏈 (rustup)&#xff0c;它包含了編譯器rustc和包管理器Cargo。Cargo是你的好朋友&#xff0c;用于創建項目…

亂刪文件,電腦不能開機,怎么辦

相信不少朋友在清理電腦、釋放空間時&#xff0c;都做過一件“后悔一整年”的事——亂刪系統文件。本來只是想讓電腦快點、干凈點&#xff0c;結果第二天一開機&#xff1a;黑屏了、藍屏了、無限重啟了&#xff0c;甚至連桌面都見不到了&#xff01;很多用戶在刪文件時&#xf…

ICODE SLIX2有密鑰保護的物流跟蹤、圖書館管理ISO15693標簽讀寫Delphi源碼

本示例使用設備&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.6781645eXF3tm5&ftt&id959258149468 一、密鑰認證 procedure TForm1.Button21Click(Sender: TObject); varctrlword:byte;passwordid:byte; //密鑰類型status:byte; //存…

核環境特種機器人設備的抗輻照芯片選型方案

摘要&#xff1a;核能作為國家能源安全的重要組成部分&#xff0c;對工業自動化設備的穩定性和可靠性提出了極高的要求。機器人設備在涉核環境下的日常巡檢、設備維護、應急響應等任務中發揮著不可替代的作用。然而&#xff0c;涉核環境&#xff0c;尤其是高能粒子的輻照效應&a…

Linux權限系統完全指南:從本質到安全實踐

一、權限的本質&#xff1a;Linux安全的核心邏輯在Linux的多用戶環境中&#xff0c;權限系統通過三個關鍵維度實現資源隔離&#xff1a;用戶標識 (UID)&#xff1a;系統通過數字ID識別用戶&#xff0c;root用戶的UID固定為0組標識 (GID)&#xff1a;用戶組機制實現批量權限管理…

養老院跌倒漏報率↓78%!陌訊多模態算法在智慧照護中的邊緣計算優化

?摘要??&#xff1a; 針對養老場景中復雜光照與遮擋導致的跌倒漏報問題&#xff0c;陌訊視覺算法通過多模態融合與邊緣計算優化&#xff0c;實測顯示在RK3588 NPU硬件上實現??mAP0.5達89.3%??&#xff0c;較基線模型提升28.5%&#xff0c;功耗降低至7.2W。本文解析其動態…

老年護理實訓室建設方案:打造安全、規范、高效的實踐教學核心平臺

在老齡化社會加速發展的背景下&#xff0c;培養高素質、技能過硬的老年護理專業人才迫在眉睫。一個設計科學、功能完備的老年護理實訓室&#xff0c;正是院校提升實踐教學質量&#xff0c;對接行業需求的核心平臺。本方案旨在構建一個安全、規范、高效的現代化實訓環境。點擊獲…

OpenCv中的 KNN 算法實現手寫數字的識別

目錄 一.案例&#xff1a;手寫數字的識別 1.安裝opencv-python庫 2.將大圖分割成10050個小圖&#xff0c;每份對應一個手寫數字樣品 3.訓練集和測試集 4.為訓練集和測試集準備結果標簽 5.模型訓練與預測 6.計算準確率 7.完整代碼實現 一.案例&#xff1a;手寫數字的識別…

TCP/IP 傳輸層詳解

TCP/IP 傳輸層詳解 傳輸層&#xff08;Transport Layer&#xff09;是 TCP/IP 模型的第四層&#xff08;對應 OSI 模型的傳輸層&#xff09;&#xff0c;核心功能是實現 端到端&#xff08;進程到進程&#xff09;的可靠通信。主要協議包括&#xff1a; TCP&#xff08;傳輸控制…

深度學習筆記:Overview

本文根據吳恩達老師的深度學習課程整理而來&#xff0c;在此表示感知。 文章目錄1.課程筆記2.編程作業1.課程筆記 1&#xff09;深度學習筆記&#xff08;1&#xff09;&#xff1a;神經網絡基礎 2&#xff09;深度學習筆記&#xff08;2&#xff09;&#xff1a;淺層神經網絡…