C++11中的Condition_variable

C++11中的condition_variable

在C++11中,條件變量(std::condition_variable)是線程同步機制之一,用于在多線程環境中實現線程間的通信和協調。它允許一個或多個線程在某個條件尚未滿足時等待,直到其他線程通知條件已經滿足。條件變量通常與互斥鎖(std::mutex)一起使用,以確保線程安全。

1. 包含頭文件

在使用條件變量之前,需要包含 <condition_variable><mutex> 頭文件:

#include <condition_variable>
#include <mutex>

2. 聲明條件變量和互斥鎖

條件變量需要與互斥鎖配合使用,互斥鎖用于保護共享資源,條件變量用于線程間的同步。

std::mutex mtx; // 互斥鎖
std::condition_variable cv;  // 條件變量

3. 等待條件

線程可以通過 cv.wait()cv.wait_for() 等方法等待條件滿足。cv.wait() 需要一個互斥鎖作為參數,并且會自動釋放互斥鎖,直到條件變量被通知為止。在等待期間,線程會被阻塞。

std::unique_lock<std::mutex> lock(mtx); // 加鎖
cv.wait(lock,[](){return condition;  };);// 等待條件滿足
  • condition 是一個布爾表達式,用于判斷是否滿足等待條件。
  • std::unique_lock 是一種更靈活的互斥鎖,支持延遲加鎖和解鎖。

4. 通知條件

當條件滿足時,可以通過 cv.notify_one()cv.notify_all() 喚醒等待的線程:

  • cv.notify_one():喚醒一個等待的線程。
  • cv.notify_all():喚醒所有等待的線程。

示例代碼

以下是一個完整的示例,展示了如何使用條件變量實現生產者-消費者模型:

#include <iostream>
#include<mutex>
#include<condition_variable>
#include<thread>
#include<queue>
using namespace std;std::queue<int> que; // 共享隊列
std::mutex mtx;      // 互斥鎖
std::condition_variable cv; // 條件變量// 生產者線程
void Producer()
{for (int i = 0; i < 10; i++){std::unique_lock<std::mutex> lock(mtx); // 加鎖que.push(i); // 生產數據cout << "Producer " << i << endl;lock.unlock();cv.notify_one(); // 通知消費者std:this_thread::sleep_for(std::chrono::milliseconds(100));}
}// 消費者線程
void Customer()
{while (true){std::unique_lock<std::mutex> lock(mtx); // 加鎖cv.wait(lock, []() {return !que.empty(); }); // 等待隊列非空int nValue = que.front(); // 消費數據que.pop();std::cout << "customer " << nValue << endl;if (nValue == 9)break;lock.unlock();std:this_thread::sleep_for(std::chrono::milliseconds(100));}
}int main()
{std::thread th1(Producer);std::thread th2(Customer);th1.join();th2.join();std::cout << "Hello World!\n";
}

代碼運行結果:

微信截圖_20250309194128

注意事項

  1. 條件變量必須與互斥鎖配合使用,否則會導致未定義行為。
  2. 虛假喚醒cv.wait() 可能會因為虛假喚醒而被觸發,因此需要在等待條件中使用循環或條件表達式來確保條件真正滿足。
  3. 線程安全:在使用條件變量時,必須確保共享資源的訪問是線程安全的,通常通過互斥鎖來保護共享資源。

通過合理使用條件變量,可以實現高效的線程同步和通信,適用于生產者-消費者、線程池等多種場景。

說明:以上代碼來自kimi AI助手。

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

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

相關文章

IO多路復用實現并發服務器

一.select函數 select 的調用注意事項 在使用 select 函數時&#xff0c;需要注意以下幾個關鍵點&#xff1a; 1. 參數的修改與拷貝 readfds 等參數是結果參數 &#xff1a; select 函數會直接修改傳入的 fd_set&#xff08;如 readfds、writefds 和 exceptfds&#xf…

_二級繼電器程控放大倍數自動設置

簡介 在開發項目中&#xff0c;有時會遇到需要使用程控放大的情況&#xff0c;如果沒有opa那種可編程放大器&#xff0c;那么就需要通過繼電器來控制放大倍數。而在繼電器程控中&#xff0c;常用的是二級程控&#xff0c;三級程控相較于二級就復雜了許多。 在二級程控中&#x…

電腦總顯示串口正在被占用處理方法

1.現象 在嵌入式開發過程中&#xff0c;有很多情況下要使用串口調試&#xff0c;其中485/422/232轉usb串口是非常常見的做法。 根據協議&#xff0c;接口芯片不同&#xff0c;需要安裝對應的驅動程序&#xff0c;比如ch340&#xff0c;cp2102&#xff0c;CDM212364等驅動。可…

優雅拼接字符串:StringJoiner 的完整指南

在Java開發中&#xff0c;字符串拼接是高頻操作。無論是日志格式化、構建CSV數據&#xff0c;還是生成動態SQL&#xff0c;開發者常需處理分隔符、前綴和后綴的組合。傳統的StringBuilder雖然靈活&#xff0c;但代碼冗余且易出錯。Java 8推出的StringJoiner類&#xff0c;以簡潔…

LabVIEW閉環控制系統硬件選型與實時性能

在LabVIEW閉環控制系統的開發中&#xff0c;硬件選型直接影響系統的實時性、精度與穩定性。需綜合考慮數據采集速度&#xff08;采樣率、接口帶寬&#xff09;、計算延遲&#xff08;算法復雜度、處理器性能&#xff09;、輸出響應時間&#xff08;執行器延遲、控制周期&#x…

Hive的架構

1. 概念 Hive 是建立在 Hadoop 上的數據倉庫工具&#xff0c;旨在簡化大規模數據集的查詢與管理。它通過類 SQL 語言&#xff08;HiveQL&#xff09;將結構化數據映射為 Hadoop 的 MapReduce&#xff0c;適合離線批處理&#xff0c;尤其適用于數據倉庫場景。 2. 數據模型 表&a…

深入解析:Linux中KVM虛擬化技術

這篇文章將深入分析Linux中虛擬化技術的實現----KVM技術&#xff0c;從KVM技術的簡介、技術架構、以及虛擬機和宿主機交互的重要處理邏輯出發&#xff0c;深入探究KVM技術的實現。 一、KVM簡介&#xff1a; 首先&#xff0c;我們先查看一下KVM架構&#xff0c;看看它的整體工…

golang學習筆記——go語言安裝及系統環境變量設置

文章目錄 go語言安裝go envgo getgoproxy測試安裝 Go 插件安裝 Go 插件依賴工具參考資料用戶環境變量和系統環境變量用戶環境變量系統環境變量示例設置環境變量的步驟設置用戶環境變量設置系統環境變量 驗證環境變量總結 2024年最火的5大Go框架1. Gin&#xff1a;高并發接口的“…

3.6c語言

#define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <stdio.h> int main() {int sum 0,i,j;for (j 1; j < 1000; j){sum 0;for (i 1; i < j; i){if (j % i 0){sum i;} }if (sum j){printf("%d是完數\n", j);}}return 0; }#de…

【TI】如何更改 CCS20.1.0 的 WORKSPACE 默認路徑

參考鏈接&#xff1a; 如何更改 CCS Theia 中工作區的默認位置&#xff1f;- Code Composer Studio 論壇 - Code Composer Studio?? - TI E2E 支持論壇 --- How to change the default location for the workspace in CCS Theia? - Code Composer Studio forum - Code Comp…

Vue3中動態Ref的魔法:綁定與妙用

前言 在Vue 3的開發過程中,動態綁定Ref是一項非常實用的技術,特別是在處理復雜組件結構和動態數據時。通過動態綁定Ref,我們可以更靈活地訪問和操作DOM元素或組件實例,實現更高效的交互和狀態管理。本文將詳細介紹如何在Vue 3中實現動態Ref的綁定,并通過實例展示其妙用。…

CarPlanner:用于自動駕駛大規模強化學習的一致性自回歸軌跡規劃

25年2月來自浙大和菜鳥網絡的論文“CarPlanner: Consistent Auto-regressive Trajectory Planning for Large-scale Reinforcement Learning in Autonomous Driving”。 軌跡規劃對于自動駕駛至關重要&#xff0c;可確保在復雜環境中安全高效地導航。雖然最近基于學習的方法&a…

VS Code連接服務器教程

VS Code是什么 VS Code&#xff08;全稱 Visual Studio Code&#xff09;是一款由微軟推出的免費、開源、跨平臺的代碼編輯神器。VS Code 支持 所有主流操作系統&#xff0c;擁有強大的功能和靈活的擴展性。 官網&#xff1a;https://code.visualstudio.com/插件市場&#xff1…

【JavaWeb】Web基礎概念

文章目錄 1、服務器與客戶端2、服務器端應用程序3、請求和響應4、項目的邏輯構成5、架構5.1 概念5.2 發展演變歷程單一架構分布式架構 5.3 單一架構技術體系 6、本階段技術體系 1、服務器與客戶端 ①線下的服務器與客戶端 ②線上的服務器與客戶端 2、服務器端應用程序 我…

安徽省考計算機專業科目2025(持續更新)

目錄 第一部分 計算機科學技術基礎 第一章 計算機及其應用基礎知識 1.1 計算機的特點、分類及其應用 1.2 信息編碼與數據表示&#xff1b;數制及其轉換方法&#xff1b;算術運算和邏輯運算的過程 第一部分 計算機科學技術基礎 第一章 計算機及其應用基礎知識 1.1 計算機…

前端知識點---路由模式-實例模式和單例模式(ts)

在 ArkTS&#xff08;Ark UI 框架&#xff09;中&#xff0c;路由實例模式&#xff08;Standard Instance Mode&#xff09;主要用于管理頁面跳轉。當創建一個新頁面時&#xff0c;可以選擇標準實例模式&#xff08;Standard Mode&#xff09;或單實例模式&#xff08;Single M…

【leetcode hot 100 73】矩陣置零

解法一&#xff1a;&#xff08;使用兩個標記變量&#xff09;用矩陣的第一行和第一列代替方法一中的兩個標記數組&#xff08;col、row[ ]&#xff1a;第幾列、行出現0&#xff09;&#xff0c;以達到 O(1) 的額外空間。 這樣會導致原數組的第一行和第一列被修改&#xff0c;…

【十三】Golang 通道

&#x1f4a2;歡迎來到張胤塵的開源技術站 &#x1f4a5;開源如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 通道通道聲明初始化緩沖機制無緩沖通道代碼示例 帶…

【JAVA架構師成長之路】【電商系統實戰】第12集:秒殺系統性能優化實戰(CAN + Nginx + Sentinel)

30分鐘課程&#xff1a;秒殺系統性能優化實戰&#xff08;CDN Nginx Sentinel&#xff09; 課程目標 掌握靜態資源 CDN 加速的配置與優化策略。通過 Nginx 實現負載均衡&#xff0c;提升系統橫向擴展能力。使用 Sentinel 實現服務降級&#xff0c;保障核心鏈路穩定性。 課程…

K8S學習之基礎十八:k8s的灰度發布和金絲雀部署

灰度發布 逐步擴大新版本的發布范圍&#xff0c;從少量用戶逐步擴展到全體用戶。 特點是分階段發布、持續監控、逐步擴展 適合需要逐步驗證和降低風險的更新 金絲雀部署 將新版本先部署到一小部分用戶或服務器&#xff0c;觀察其表現&#xff0c;再決定是否全面推廣。 特點&…