C++中std::atomic_bool詳解和實戰示例

std::atomic_bool 是 C++ 標準庫中提供的一種 原子類型,用于在多線程環境下對布爾值進行 線程安全的讀寫操作,避免使用 std::mutex 帶來的性能開銷。


1. 基本作用

在多線程環境中,多個線程同時訪問一個 bool 類型變量可能會出現 競態條件(race condition)。使用 std::atomic_bool 可以確保:

  • 每次讀取和寫入都是 原子性的
  • 不需要手動加鎖;
  • 性能比 std::mutex 更好,適用于控制標志位等簡單變量。

2. 常用操作

操作說明
load()原子讀取值
store(true/false)原子寫入值
exchange(value)原子地將值替換為 value 并返回舊值
compare_exchange_weak原子比較并條件賦值(弱)
compare_exchange_strong原子比較并條件賦值(強)

3. 示例代碼:線程安全的停止標志

#include <iostream>
#include <thread>
#include <atomic>
#include <chrono>std::atomic_bool stop_flag(false);void worker_thread() {std::cout << "Worker thread started.\n";while (!stop_flag.load()) {std::this_thread::sleep_for(std::chrono::milliseconds(500));std::cout << "Working...\n";}std::cout << "Worker thread stopping.\n";
}int main() {std::thread t(worker_thread);std::this_thread::sleep_for(std::chrono::seconds(2));std::cout << "Main thread: stopping worker.\n";stop_flag.store(true); // 原子寫入,通知線程退出t.join();std::cout << "Main thread: done.\n";return 0;
}

4. exchange() 用法示例

std::atomic_bool flag(false);// 原子地將 flag 設置為 true,并獲取舊值
bool was_set = flag.exchange(true);
if (!was_set) {std::cout << "First time setting flag!\n";
} else {std::cout << "Flag was already set.\n";
}

5. compare_exchange_strong() 用法示例

std::atomic_bool ready(false);
bool expected = false;if (ready.compare_exchange_strong(expected, true)) {std::cout << "We changed it from false to true.\n";
} else {std::cout << "It was already true.\n";
}

compare_exchange_strong(expected, new_val) 的意思是:

  • 如果當前值 == expected,則原子地賦值為 new_val,并返回 true
  • 否則返回 false,且 expected 被更新為當前值。

6. 和 volatile 的區別?

項目std::atomicvolatile
原子性保證??
線程安全??
用于多線程??(不適用)

7. 典型應用場景

  • 線程停止標志(如 kill_switch, terminate_flag
  • 單次初始化控制(once_flag 替代方案)
  • 簡單信號通信(如觸發事件)

8. 實戰應用示例

在建圖(SLAM)系統中,std::atomic_bool 通常用于 線程控制標志,以線程安全方式實現異步邏輯的終止、控制或狀態指示。以下是詳細用途、使用示例,以及與建圖模塊結合的典型場景。


建圖系統中常見使用場景

變量名類型作用說明
kill_switchstd::atomic_bool強制立即終止后端建圖線程
end_of_sequencestd::atomic_bool等待數據隊列處理完后自動終止線程
request_to_optimizestd::atomic_bool請求觸發一次后端優化
request_to_recoverstd::atomic_bool請求重新恢復全局狀態或軌跡
is_mappingstd::atomic_bool指示建圖線程當前是否運行中
has_new_datastd::atomic_bool用于觸發新數據到來時的條件變量喚醒

建圖線程中的使用示例

class AsyncMapping {
public:AsyncMapping() : kill_switch(false), end_of_sequence(false), request_to_optimize(false) {mapping_thread = std::thread(&AsyncMapping::run, this);}~AsyncMapping() {kill_switch.store(true);         // 強制中斷condition.notify_all();if (mapping_thread.joinable()) mapping_thread.join();}void insert_submap(const SubMap::Ptr& submap) {{std::lock_guard<std::mutex> lock(queue_mutex);submap_queue.push(submap);}request_to_optimize.store(true);condition.notify_one(); // 喚醒線程}private:void run() {while (!kill_switch.load()) {std::unique_lock<std::mutex> lock(queue_mutex);condition.wait(lock, [&]() {return kill_switch.load() || !submap_queue.empty() || request_to_optimize.load();});if (kill_switch.load()) break;// 處理隊列while (!submap_queue.empty()) {auto submap = submap_queue.front();submap_queue.pop();process_submap(submap);}if (request_to_optimize.exchange(false)) {optimize(); // 執行一次后端優化}}}void process_submap(const SubMap::Ptr& submap);void optimize();private:std::atomic_bool kill_switch;std::atomic_bool end_of_sequence;std::atomic_bool request_to_optimize;std::queue<SubMap::Ptr> submap_queue;std::mutex queue_mutex;std::condition_variable condition;std::thread mapping_thread;
};

** 技巧說明**

  • atomic_bool + condition_variable 是建圖線程中典型的等待-通知機制組合。
  • exchange(false) 常用于“消費型”標志,即只觸發一次(如 request_to_optimize)。
  • 在析構時使用 kill_switch 可以 無鎖安全終止線程,無需強行 detach

推薦命名規范

標志變量推薦用途
kill_switch強制立即終止所有建圖處理
optimization_flag表示優化請求
data_ready數據隊列中是否有數據可處理
map_updated是否生成新地圖輸出
need_save是否需要保存地圖(外部觸發)

如果使用 ThreadPool + std::future,也可以這樣結合:

if (request_to_optimize.exchange(false)) {thread_pool.submit([this]() {global_mapping->optimize();  // 異步觸發建圖優化});
}

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

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

相關文章

深度學習之分類手寫數字的網絡

面臨的問題 定義神經?絡后&#xff0c;我們回到?寫識別上來。我們可以把識別?寫數字問題分成兩個?問題&#xff1a; 把包含許多數字的圖像分成?系列單獨的圖像&#xff0c;每個包含單個數字&#xff1b; 也就是把圖像 &#xff0c;分成6個單獨的圖像 分類單獨的數字 我們將…

nginx基本使用 linux(mac下的)

目錄結構 編譯后會有&#xff1a;conf html logs sbin 四個文件 &#xff08;其他兩個是之前下載的安裝包&#xff09; conf&#xff1a;配置文件html&#xff1a;頁面資源logs&#xff1a;日志sbin&#xff1a;啟動文件&#xff0c;nginx主程序 運行后多了文件&#xff1a;&l…

基于大眾點評的重慶火鍋在線評論數據挖掘分析(情感分析、主題分析、EDA探索性數據分析)

文章目錄 有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目介紹數據采集數據預處理EDA探索性數據分析關鍵詞提取算法情感分析LDA主題分析總結每文一語 有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主 項目介紹 本…

鴻蒙系統(HarmonyOS)應用開發之經典藍色風格登錄頁布局、圖文驗證碼

一、項目概述 本項目是一款基于鴻蒙 ArkTS&#xff08;ETS&#xff09;開發的用戶登錄頁面&#xff0c;集成了圖文驗證碼功能&#xff0c;旨在為應用提供安全、便捷的用戶身份驗證入口。項目采用現代化 UI 設計&#xff0c;兼顧用戶體驗與安全性&#xff0c;適用于多種需要用戶…

0.96寸OLED顯示屏 江協科技學習筆記(36個知識點)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36

Flutter SnackBar 控件詳細介紹

文章目錄 Flutter SnackBar 控件詳細介紹基本特性基本用法1. 顯示簡單 SnackBar2. 自定義持續時間 主要屬性高級用法1. 帶操作的 SnackBar2. 自定義樣式3. 浮動式 SnackBar SnackBarAction 屬性實際應用場景注意事項完整示例建議 Flutter SnackBar 控件詳細介紹 SnackBar 是 F…

【C++】頭文件的能力與禁忌

在C中&#xff0c;?頭文件&#xff08;.h/.hpp&#xff09;?? 的主要作用是聲明接口和共享代碼&#xff0c;但如果不規范使用&#xff0c;會導致編譯或鏈接錯誤。以下是詳細總結&#xff1a; 一、頭文件中可以做的事情 1.1 聲明 函數聲明&#xff08;無需inline&#xff…

騰訊 iOA 零信任產品:安全遠程訪問的革新者

在當今數字化時代&#xff0c;企業面臨著前所未有的挑戰與機遇。隨著遠程辦公、多分支運營以及云計算的廣泛應用&#xff0c;傳統的網絡安全架構逐漸暴露出諸多不足。騰訊 iOA 零信任產品憑借其創新的安全理念和強大的功能特性&#xff0c;為企業提供了一種全新的解決方案&…

IP5219全集成Type-C移動電源SOC!2.1A快充+2.4A放電,極簡BOM方案

產品概述&#xff1a; IP5219是一款集成升壓轉換器、鋰電池充電管 理、電池電量指示和TYPE_C協議的多功能電源管 理SOC&#xff0c;為移動電源提供完整的電源解決方案。 IP5219的高集成度與豐富功能&#xff0c;使其在應用時 僅需極少的外圍器件&#xff0c;并有效減小整體方案…

報道稱CoreWeave洽談收購Core Scientific,后者漲超30%

CoreWeave與數字基礎設施公司Core Scientific的收購事宜可能在未來幾周內敲定交易&#xff0c;前提是雙方不出現重大分歧。消息傳出后&#xff0c;Core Scientific股價一度暫停交易&#xff0c;隨后恢復交易最終收漲逾32%。 AI云服務巨頭CoreWeave正與數字基礎設施公司Core Sc…

Qt5.15.2實現WebAssembly:2、設置emsdk目錄

步驟1 打開QT&#xff0c;編輯&#xff0c;Preference&#xff08;首選項&#xff09;&#xff1a; 設備&#xff0c;WebAssembly&#xff0c;游覽。 找到安裝好的emscripten目錄&#xff0c;選擇。 稍等一會&#xff0c;QT會解析出相應的信息&#xff0c;再點確定。 圖中…

SpringMVC--使用RESTFul實現用戶管理系統

一、靜態頁面準備 1. user.css .header {background-color: #f2f2f2;padding: 20px;text-align: center; }ul {list-style-type: none;margin: 0;padding: 0;overflow: hidden;background-color: #333; }li {float: left; }li a {display: block;color: white;text-align: ce…

hello算法_C++_ 最差、最佳、平均時間復雜度

算法的時間效率往往不是固定的&#xff0c;而是與輸入數據的分布有關。假設輸入一個長度為 的數組 nums &#xff0c;其中 nums 由從 1 至 n 的數字組成&#xff0c;每個數字只出現一次&#xff1b;但元素順序是隨機打亂的&#xff0c;任務目標是返回元素 的索引。我們可以…

2024考研數一真題及答案

歷年數一真題及答案下載直通車 已知函數 f ( x ) ∫ 0 x e cos ? t d t f(x) \int_0^x e^{\cos t} dt f(x)∫0x?ecostdt&#xff0c; g ( x ) ∫ 0 sin ? x e t 2 d t g(x) \int_0^{\sin x} e^{t^2} dt g(x)∫0sinx?et2dt&#xff0c;則&#xff08; &#xff09;。 A…

MIT 6.824學習心得(2) 淺談多線程和RPC

上篇文章中我們簡單介紹了分布式系統的設計思想以及簡單性質&#xff0c;之后用一定篇幅簡要介紹了MapReduce這個經典的分布式計算框架的大致工作原理&#xff0c;相信朋友們已經對此有了最基本的理解。在現實場景中&#xff0c;分布式系統的設計初衷是為了解決并發問題&#x…

opensuse/debian grub啟動界面太模糊?

現代操作系統或者新電腦使用那么模糊的界面啟動&#xff0c;雖然沒有什么不良反應&#xff0c;但是多少有點看不過去&#xff0c;這是因為為了保證正常啟動做出的適配。而我們可以對其分辨率進行選定。 1 您好&#xff0c;非常感謝您提供的截圖。這張圖片非常關鍵&#xff0c…

zookeeper Curator(5):集群架構和集群搭建

文章目錄 一、集群架構&#xff1a;Leader-Follower 模式二、核心機制&#xff1a;ZAB 協議三、Leader 選舉機制四、集群部署要點五、優勢與挑戰 Zookeeper 集群是一個由多個 Zookeeper 服務實例組成的分布式協調服務系統&#xff0c; 通過奇數個節點&#xff08;通常 3、5、7…

道可云人工智能每日資訊|浦東啟動人工智能創新應用競賽

道可云人工智能&元宇宙每日簡報&#xff08;2025年7月1日&#xff09;訊&#xff0c;今日人工智能&元宇宙新鮮事有&#xff1a; 江城模境工信部人工智能大模型公共服務平臺&#xff08;武漢&#xff09;上線運行 2025年6月27日&#xff0c;光谷人工智能創新大會在湖北…

Python元組的遍歷

一、前言 在 Python 中&#xff0c;元組&#xff08;tuple&#xff09; 是一種非常基礎且常用的數據結構&#xff0c;它與列表類似&#xff0c;都是有序的序列&#xff0c;但不同的是&#xff0c;元組是不可變的&#xff08;immutable&#xff09;&#xff0c;一旦創建就不能修…

矩陣的條件數(Condition Number of a Matrix)

文章目錄 矩陣的條件數&#xff08;Condition Number of a Matrix&#xff09;&#x1f4cc; 定義&#x1f9ee; 常見形式&#xff1a;2-范數下的條件數&#x1f50d; 條件數的意義&#x1f9e0; 實際意義舉例&#x1f4bb; Python 示例&#xff08;NumPy&#xff09;&#x1f…