淺析std::atomic<T>::compare_exchange_weak和std::atomic<T>::compare_exchange_strong

目錄

std::atomic ::compare_exchange_weak?和?std::atomic ::compare_exchange_strong?

核心原理

函數簽名

核心區別

典型用法

1.?compare_exchange_weak(循環內重試)

2.?compare_exchange_strong(單次嘗試)

底層機制

總結


std::atomic<T>::compare_exchange_weak?和?std::atomic<T>::compare_exchange_strong?

核心原理

這兩個函數都是?原子比較-交換(Compare-and-Swap, CAS)?操作,屬于無鎖編程的基礎操作。其偽代碼邏輯如下:

bool compare_exchange(T& expected, T desired) {if (atomic_value == expected) {atomic_value = desired;  // 交換成功return true;} else {expected = atomic_value;  // 更新 expected 為當前值return false;}
}

關鍵點:整個操作是原子的(不可中斷),用于實現無鎖數據結構(如隊列、棧)。


函數簽名

bool compare_exchange_weak(T& expected, T desired, memory_order success = memory_order_seq_cst,memory_order failure = memory_order_seq_cst);bool compare_exchange_strong(T& expected, T desired,memory_order success = memory_order_seq_cst,memory_order failure = memory_order_seq_cst);

  • expected:傳入期望值,失敗時會被更新為原子變量的當前值。

  • desired:交換成功時設置的目標值。

  • 內存序success(成功時的內存序)和?failure(失敗時的內存序)。


核心區別

特性compare_exchange_weakcompare_exchange_strong
虛假失敗可能(即使值相等也返回?false不可能(僅在值不相等時失敗)
性能更高(某些平臺減少重試開銷)稍低(保證嚴格比較)
適用場景循環內重試(如自旋鎖)單次嘗試或無循環場景
硬件依賴在 ARM/PowerPC 等平臺可能虛假失敗所有平臺行為一致

典型用法

1.?compare_exchange_weak(循環內重試)
std::atomic<int> val(10);
int expected = val.load();  // 獲取當前值do {int desired = expected * 2;  // 計算新值// 弱版本允許虛假失敗,需配合循環
} while (!val.compare_exchange_weak(expected, desired));
  • 適用場景:自旋鎖、無鎖隊列等需反復重試的操作。

2.?compare_exchange_strong(單次嘗試)
std::atomic<bool> flag(false);
bool expected = false;// 僅嘗試一次,強版本保證無虛假失敗
if (flag.compare_exchange_strong(expected, true)) {// 成功獲取鎖
} else {// 已被其他線程修改
}
  • 適用場景:單次檢查或無需重試的邏輯。


底層機制

  • 弱版本
    某些硬件(如 ARM)的 CAS 操作可能因緩存一致性協議(如 MESI)或線程調度導致虛假失敗,但硬件實現更高效。

  • 強版本
    在弱版本基礎上封裝循環,直到成功或真實失敗:

bool compare_exchange_strong(...) {while (!compare_exchange_weak(...)) {if (atomic_value != expected) break;  // 真實失敗退出}
}

總結

場景推薦函數
循環內重試(如自旋鎖)compare_exchange_weak
單次嘗試或無循環邏輯compare_exchange_strong
需最高性能(低競爭環境)weak?+ 循環
需代碼簡潔性strong(避免手動重試)

最佳實踐
在循環中優先使用?weak(如實現無鎖棧/隊列),非循環場景用?strong。例如:

// 無鎖棧的 push 操作
void push(Node* new_node) {Node* old_head = head.load();do {new_node->next = old_head;} while (!head.compare_exchange_weak(old_head, new_node));
}

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

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

相關文章

舉出一個異步接口測試的例子

以下是一個完整的 ?異步接口測試? 實際案例&#xff0c;包含問題場景、解決方案、代碼實現和面試回答技巧&#xff0c;適合在面試中展示技術深度&#xff1a; ?案例背景? ?業務場景?&#xff1a; 測試一個AI圖片生成平臺的異步接口&#xff0c;用戶提交生成請求后&#…

更新麒麟連不上外網

問題&#xff1a;更新麒麟連不上外網 處理&#xff1a;本地建個下載地址 建立文件夾/root/x86.rpm&#xff0c;子文件夾&#xff1a;Packages、repodata&#xff0c;和在線站點建的一樣&#xff1a;Index of /NS/V10/V10SP1.1/os/adv/lic/base/x86_64/&#xff0c;然后就下載…

TensorFlow深度學習實戰——使用Hugging Face構建Transformer模型

TensorFlow深度學習實戰——使用Hugging Face構建Transformer模型 0. 前言1. 安裝 Hugging Face2. 文本生成3. 自動模型選擇和自動分詞4. 命名實體識別5. 摘要生成6. 模型微調相關鏈接 0. 前言 除了需要實現特定的自定義結構&#xff0c;或者想要了解 Transformer 工作原理外&…

SAP-ABAP:SAP全模塊的架構化解析,涵蓋核心功能、行業方案及技術平臺

一、核心業務模塊&#xff08;Logistics & Operations&#xff09; 模塊代號核心功能典型流程關鍵事務碼物料管理MM采購/庫存/發票校驗采購到付款 (P2P)ME21N&#xff08;采購訂單&#xff09;, MI31&#xff08;庫存盤點&#xff09;銷售與分銷SD訂單/定價/發貨/開票訂單…

實時預警!機場機坪井室無線智能液位監測系統助力安全降本

某沿海機場因地處多雨區域&#xff0c;每年雨季均面臨排水系統超負荷運行壓力。經勘測發現&#xff0c;5個井室因長期遭受地下水滲透侵蝕&#xff0c;井壁出現細微結構性裂縫&#xff0c;導致內部水位異常升高。作為機坪地下管網系統的核心節點&#xff0c;這些井室承擔著雨水導…

邊云協同 AI 視頻分析系統設計方案

目錄 一、項目背景與目標 二、系統架構概述 總體架構圖 三、ER 圖&#xff08;核心數據庫設計&#xff09; 實體關系圖簡述 數據表設計&#xff08;簡要&#xff09; 四、模型結構圖&#xff08;邊緣云端AI推理架構&#xff09; 邊緣模型&#xff08;YOLOv5-tiny/PP-YO…

vue3整合element-plus

為項目命名 選擇vue 框架 選擇TS 啟動測試&#xff1a; npm run dev 開始整合 element-plus npm install element-plus --save npm install unplugin-vue-components unplugin vitejs/plugin-vue --save-dev 修改main.ts import { createApp } from vue import ./style.cs…

【AI 測試】測試用例設計:人工智能語言大模型性能測試用例設計

目錄 一、性能測試可視化架構圖 &#xff08;1&#xff09;測試整體架構圖 &#xff08;2&#xff09;測試體系架構圖 &#xff08;3&#xff09;測試流程時序圖 二、性能測試架構總覽 &#xff08;1&#xff09;性能測試功能點 &#xff08;2&#xff09;測試環境要…

Windsurf SWE-1模型評析:軟件工程的AI革命

引言 軟件開發領域正經歷著前所未有的變革&#xff0c;AI輔助編程工具層出不窮&#xff0c;但大多數僅專注于代碼生成這一環節。Windsurf公司近期推出的SWE-1系列模型打破了這一局限&#xff0c;首次將AI應用擴展至軟件工程的全流程。這一舉措不僅反映了行業對AI工具認知的深化…

Qt for OpenHarmony 編譯鴻蒙調用的動態庫

簡介 Qt for Harmony? 是跨平臺開發框架 ?Qt? 與華為 ?OpenHarmony? 操作系統的深度集成方案&#xff0c;由 Qt Group 與華為聯合推動。其核心目標是為開發者提供一套高效工具鏈&#xff0c;實現 ??“一次開發&#xff0c;多端部署”?&#xff0c;加速 OpenHarmony 生…

退休時,按最低基數補繳醫療保險15年大概需要多少錢

在南京退休時&#xff0c;如果醫保繳費年限不足&#xff08;男需滿25年/女需滿20年&#xff09;&#xff0c;需補繳差額年限。若按最低基數一次性補繳15年醫保&#xff0c;費用估算如下&#xff08;以2024年政策為例&#xff09;&#xff1a; 一、補繳金額計算公式 總補繳費用…

wireshark過濾顯示rtmp協議

wireshark中抓包顯示的數據報文中&#xff0c;明明可以看到有 rtmp 協議的報文&#xff0c;但是過濾的時候卻顯示一條都沒有 查看選項中的配置&#xff0c;已經沒有 RTMP 這個協議了&#xff0c;已經被 RTMPT 替換了&#xff0c;過濾框中輸入 rtmpt 過濾即可

《哈希表》K倍區間(解題報告)

文章目錄 零、題目描述一、算法概述二、算法思路三、代碼實現四、算法解釋五、復雜度分析 零、題目描述 題目鏈接&#xff1a;K倍區間 一、算法概述 計算子數組和能被k整除的子數組數量的算法。通過前綴和與哈希表的結合&#xff0c;高效地統計滿足條件的子數組。??需要注…

OpenShift 在 Kubernetes 多出的功能中,哪些開源?

OpenShift 在 Kubernetes 基礎上增加的功能中&#xff0c;部分組件是開源的&#xff08;代碼可公開訪問&#xff09;&#xff0c;而另一些則是 Red Hat 專有&#xff08;閉源&#xff09;。以下是詳細分類&#xff1a; 1. 完全開源的功能&#xff08;代碼可查&#xff09; 這些…

【每天一個知識點】CITE-seq 技術

一、技術背景 單細胞RNA測序&#xff08;scRNA-seq&#xff09;自問世以來&#xff0c;極大推動了細胞異質性和組織復雜性的研究。但RNA水平并不能完全代表蛋白質水平&#xff0c;因為蛋白質的表達受轉錄后調控、翻譯效率及蛋白降解等多種因素影響。此外&#xff0c;許多細胞類…

中文Windows系統下程序輸出重定向亂碼問題解決方案

導言 最近我在用 Rust 開發時&#xff0c;遇到了一個讓人頭疼的問題&#xff1a;運行 cargo run -- version Cargo.toml > output.txt 將輸出重定向到文件后&#xff0c;打開 output.txt 卻發現里面全是亂碼&#xff01;我的程序確實是UTF8但是輸出的文件卻是UTF16LE編碼的…

Python管理工具UV

常用 UV 命令 安裝 pip install uv 版本相關 uv python list 打印所有uv支持的python版本uv python install cpython-3.12 安裝指定的python版本uv run -p 3.12 test.py 用指定的python版本運行python代碼uv run -p 3.12 python 進入python執行環境。假如輸入的版本是一個本…

論文略讀:ASurvey on Intent-aware Recommender Systems

202406 arxiv 推薦系統在許多現代在線服務中發揮著關鍵作用&#xff0c;例如電子商務或媒體流服務&#xff0c;它們能夠為消費者和服務提供商創造巨大的價值。因此&#xff0c;過去幾十年來&#xff0c;研究人員提出了大量生成個性化推薦的技術方法。傳統算法——從早期的 Gro…

Neo4j 中存儲和查詢數組數據的完整指南

Neo4j 中存儲和查詢數組數據的完整指南 圖形數據庫 Neo4j 不僅擅長處理節點和關系&#xff0c;還提供了強大的數組(Array)存儲和操作能力。本文將全面介紹如何在 Neo4j 中高效地使用數組&#xff0c;包括存儲、查詢、優化以及實際應用場景。 數組在 Neo4j 中的基本使用 數組…

Android 編譯和打包image鏡像流程

1. 編譯命令 source build/envsetup.sh lunch aosp_car_arm64-userdebug make2. 編譯流程 source build/envsetup.sh 定義一些函數的環境變量&#xff0c;如 lunchvalidate_current_shell&#xff0c;確認 shell 環境set_global_paths&#xff0c;設置環境變量 ANDROID_GLOB…