QT原子變量:QAtomicInteger、QAtomicPointer、QAtomicFlag

引言:原子變量為何重要?

在多線程編程中,共享數據的原子性訪問是保證線程安全的核心。傳統互斥鎖雖然有效,但會帶來性能損耗和死鎖風險。QT提供的原子類型(QAtomicIntegerQAtomicPointerQAtomicFlag)通過硬件級原子指令,實現了高效的無鎖并發操作。本文將深入解析每種原子類型的使用場景及最佳實踐。


一、QT原子類型詳解與場景分析

1. QAtomicInteger<T>:整數原子操作

適用場景

  • 計數器:多線程環境下的計數(如請求次數統計)

  • 狀態標志:非布爾類型的多狀態標記(如0=空閑,1=運行中,2=終止)

  • 資源分配:原子分配ID或索引(避免重復分配)

典型示例

// 全局請求計數器
QAtomicInt requestCount(0);void handleRequest() {requestCount.fetchAndAddRelaxed(1);  // 原子遞增// ...處理請求邏輯...
}

2. QAtomicPointer<T>:指針原子操作

適用場景

  • 無鎖數據結構:實現無鎖隊列、棧等(見后文案例)

  • 單例對象指針:雙重檢查鎖定模式中的指針原子操作

  • 動態對象切換:原子替換復雜對象的指針(如配置熱更新)

示例代碼

// 原子切換全局配置
QAtomicPointer<Config> globalConfig;void updateConfig(Config* newConfig) {Config* old = globalConfig.loadAcquire();while (!globalConfig.testAndSetRelaxed(old, newConfig)) {old = globalConfig.loadAcquire();}delete old;  // 安全釋放舊配置
}

3. QAtomicFlag:輕量級布爾標志

適用場景

  • 一次性初始化:確保資源只初始化一次(替代pthread_once

  • 簡單狀態鎖:作為輕量級鎖(適用于極低競爭場景)

  • 任務啟停控制:原子標記任務是否正在運行

實戰案例

QAtomicFlag initializedFlag;void initializeResource() {if (!initializedFlag.testAndSetRelaxed(false, true)) {return;  // 已被其他線程初始化}// 執行初始化操作(僅一次)
}

二、高級場景與類型選擇技巧

1. 如何選擇原子類型?

需求場景推薦類型原因
需要增減數值QAtomicInteger<int>提供fetchAndAdd等原子算術操作
需要操作對象指針QAtomicPointer<T>支持指針的CAS(Compare-And-Swap)操作
簡單的是/否狀態判斷QAtomicFlagQAtomicInt更輕量(僅需1字節存儲)

2. 復雜場景組合應用

案例:無鎖對象池

template<typename T>
class ObjectPool {
public:T* acquire() {Node* oldHead = head.loadRelaxed();while (oldHead && !head.testAndSetRelaxed(oldHead, oldHead->next)) {oldHead = head.loadRelaxed();}return oldHead ? oldHead->data : nullptr;}private:struct Node {T* data;Node* next;};QAtomicPointer<Node> head;  // 使用原子指針管理鏈表頭
};

三、內存模型與性能優化指南

1. 內存順序的選擇策略

內存順序適用場景
Relaxed單一變量的原子性保證(如計數器)無需線程間順序約束
Acquire-Release需要建立線程間同步(如初始化完成后其他線程才能讀取數據)
SequentiallyConsistent嚴格的全局順序(默認模式,性能最低)

正確使用示例

// 線程安全延遲初始化
QAtomicPointer<HeavyObject> instance;
QAtomicFlag initialized;HeavyObject* getInstance() {if (!initialized.loadAcquire()) {          // Acquire保證看到最新狀態QMutexLocker lock(&mutex);if (!initialized.loadRelaxed()) {instance.storeRelease(new HeavyObject);  // Release確保初始化完成initialized.storeRelease(true);}}return instance.loadAcquire();
}

2. 性能陷阱規避

  • 避免過度原子化:僅對真正共享的變量使用原子操作

  • 警惕ABA問題:使用QAtomicPointer時,結合版本號(QT的QAtomicPointer支持版本標記)

  • 平臺適配性:ARM等弱內存模型平臺需嚴格測試內存順序


四、QT原子變量 vs C++11原子類型

從QT5到QT6的過渡建議:

特性QAtomic系列std::atomic
跨平臺兼容性支持舊編譯器(C++98)需要C++11支持
內存順序控制提供Acquire/Release語義提供更細粒度的6種內存順序
指針操作專有QAtomicPointerstd::atomic<T*>
推薦使用場景QT5項目、嵌入式開發QT6新項目、現代C++開發

五、總結與最佳實踐

  1. 類型選擇三要素:操作類型(整型/指針)、性能需求、內存順序要求

  2. 簡單原則:能用QAtomicFlag就不選QAtomicInt

  3. 復合操作仍需鎖:原子變量無法替代所有互斥鎖(例如需要保護多個變量的關聯操作)

  4. 測試驗證:使用ThreadSanitizer等工具驗證原子操作的正確性

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

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

相關文章

大模型金融企業場景落地應用

一、商業銀行體系 1. 江蘇銀行 企業背景&#xff1a;江蘇銀行是總部位于江蘇南京的全國性股份制商業銀行&#xff0c;在城商行中資產規模位居前列&#xff0c;積極擁抱金融科技&#xff0c;將數字化轉型作為核心戰略之一。近年來&#xff0c;江蘇銀行持續加大在人工智能、大數…

卡特蘭數在數據結構上面的運用

原理 Catalan數是一個數列&#xff0c;其第n項表示n個不同結點可以構成的二叉排序樹的數量。Catalan數的第n項公式為&#xff1a; &#xfffc; 其中&#xff0c;&#xfffc;是組合數&#xff0c;表示從2n個元素中選擇n個元素的組合數。 Catalan數的原理可以通過以下方式理解&…

影視后期工具學習之PR(中)

pr剪輯之旅----聲音設計 第五課 鏡頭語言和綠幕摳像 超級鍵效果(超級鍵通過簡單的吸管取色和參數調整,即可實現專業級摳像與合成效果。無論是綠幕替換背景,還是創意雙重曝光,都能輕松駕馭。建議結合「Alpha 通道」視圖觀察透明區域,逐步優化細節,最終導出高質量視頻。)…

使用BootStrap 3的原創的模態框組件,沒法彈出!估計是原創的bug

最近在給客戶開發一個CRM系統&#xff0c;其中用到了BOOTSTRAP的模態框。版本是3。由于是剛開始用該框架。所以在正式部署到項目中前&#xff0c;需要測試一下&#xff0c;找到框架中的如下部分。需要說明的是。我用的asp.net mvc框架開發。測試也是在asp.net mvc環境下。 復制…

Camera2 與 CameraX 閑談

目錄 &#x1f4c2; 前言 1. &#x1f531; Camera2 2. &#x1f531; CameraX 3. &#x1f531; Camera2 與 CameraX 1&#xff09;使用復雜度與開發效率 2&#xff09;控制能力與應用場景 3&#xff09;設備兼容性與穩定性 4&#xff09;更新與維護 4. &#x1f4a0…

【大語言模型_8】vllm啟動的模型通過fastapi封裝增加api-key驗證

背景&#xff1a; vllm推理框架啟動模型不具備api-key驗證。需借助fastapi可以實現該功能 代碼實現&#xff1a; rom fastapi import FastAPI, Header, HTTPException, Request,Response import httpx import logging# 創建 FastAPI 應用 app FastAPI() logging.basicConfig(…

基于SpringBoot的名著閱讀網站

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…

Langchain 自定義工具和內置工具

使用介紹 自定義工具時的元素概念介紹 在Langchain中&#xff0c;工具&#xff08;Tool&#xff09;是與語言模型交互的基本單元。以下是自定義工具時的關鍵元素&#xff1a; name 定義&#xff1a;工具的名稱&#xff0c;用于唯一標識該工具。作用&#xff1a;當工具被集成…

Gitee上庫常用git命令

Gitee上庫常用git命令 1、Fork 項目2、個人倉庫修改3、追加提交4、創建PR5、多筆commit合一 1、Fork 項目 2、個人倉庫修改 git add . // -s 表示自動添加郵箱簽名信息&#xff0c;-m表示其后跟隨commit描述 git commit -sm “add transition freeze” git push origin [目標…

Java 大視界 -- Java 大數據在智慧農業精準灌溉與施肥決策中的應用(144)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

Redux,React-redux。基礎

狀態管理庫&#xff0c;集中式存儲狀態&#xff0c;管理狀態 ? redux //簡單實現 redux源碼 export function createStore(reducer) {// reducer由用戶編寫&#xff0c; 必須是一個函數&#xff0c;dispatch的時候&#xff0c;reducer要執行if (typeof reducer ! function) t…

5.2 位運算專題:LeetCode 268. 丟失的數字

1. 題目鏈接 LeetCode 268. 丟失的數字 2. 題目描述 給定一個包含 [0, n] 范圍內 n 個不同整數的數組 nums&#xff08;實際長度為 n&#xff09;&#xff0c;找出數組中缺失的那個數字。 示例&#xff1a; 輸入&#xff1a;nums [3,0,1] → 輸出&#xff1a;2&#xff08;…

基于第三方庫的人臉識別系統的設計與實現

標題:基于第三方庫的人臉識別系統的設計與實現 內容:1.摘要 本文針對傳統人臉識別系統開發復雜、效率低的問題&#xff0c;旨在設計并實現基于第三方庫的人臉識別系統。通過選用合適的第三方人臉識別庫&#xff0c;利用其成熟的算法和接口&#xff0c;簡化系統開發流程。對收集…

【Android】VehiclePropertyAccess引起CarService崩潰

VehiclePropertyAccess引起CarService崩潰 VehiclePropertyAccess VehiclePropertyAccess屬性&#xff0c;用于定義車輛屬性的訪問權限。權限包括 讀&#xff1a;READ&#xff0c;只可以讀取&#xff0c;不能寫入。 VehiclePropertyAccess:READ寫&#xff1a;WRITE&#xf…

【Go】Go語言并發模型:MPG

Go 語言并發模型&#xff1a;MPG Go 的并發模型主要由三個部分構成&#xff1a; M (Machine) 系統線程&#xff0c;用于實際執行任務。 P (Processor) 邏輯處理器&#xff0c;負責管理和調度 goroutine。每個 P 擁有一個本地隊列和關聯的全局 G 隊列。 G (Goroutine) Go 語言…

SpringCloud配置中心:Config Server與配置刷新機制

文章目錄 引言一、Config Server基礎架構1.1 Server端配置1.2 配置文件命名規則 二、Config Client配置2.1 Client端配置2.2 配置注入與使用 三、配置刷新機制3.1 手動刷新配置3.2 使用Spring Cloud Bus實現自動刷新3.3 配置倉庫Webhook自動觸發刷新 四、高級配置管理策略4.1 配…

PyTorch生成式人工智能實戰:從零打造創意引擎

PyTorch生成式人工智能實戰&#xff1a;從零打造創意引擎 0. 前言1. 生成式人工智能1.1 生成式人工智能簡介1.2 生成式人工智能技術 2. Python 與 PyTorch2.1 Python 編程語言2.2 PyTorch 深度學習庫 3. 生成對抗網絡3.1 生成對抗網絡概述3.2 生成對抗網絡應用 4. Transformer4…

allure結合pytest生成測試報告

結合 pytest 和 Allure 可以生成詳細而美觀的測試報告&#xff0c;幫助測試人員和開發者更好地理解測試結果。這包括測試的執行情況、步驟、附件&#xff08;如截圖&#xff09;、分類以及優先級標記。下面是如何在 pytest 中使用 Allure 生成測試報告的步驟&#xff1a; 安裝…

STM32標準庫開發中斷流程

在STM32標準外設庫&#xff08;SPL&#xff09;開發中&#xff0c;外設中斷的處理流程通常如下&#xff1a; 一、標準庫外設中斷處理流程 &#xff08;1&#xff09;使能外設時鐘 在使用任何外設之前&#xff0c;都必須打開外設的時鐘。例如&#xff0c;使用USART1的中斷&…

【計算機網絡】-計算機網絡期末復習題復習資料

一、計算機網絡體系結構&#xff08;800字&#xff09; 1. OSI參考模型 七層結構&#xff1a;物理層→數據鏈路層→網絡層→傳輸層→會話層→表示層→應用層 各層核心功能&#xff1a; 物理層&#xff1a;比特流傳輸&#xff08;如RJ45、光纖接口&#xff09; 數據鏈路層&…