Qt 重入和線程安全

重入和線程安全

在整個文檔中,"重入"和 "線程安全 "這兩個術語被用來標記類和函數,以表明它們在多線程應用程序中的使用方式:

  • 線程安全函數可以同時被多個線程調用,即使調用使用的是共享數據,因為共享數據的所有引用都已序列化。
  • 重入函數也可以同時被多個線程調用,但前提是每次調用都使用自己的數據。

因此,線程安全的函數總是可重入的,但可重入的函數并不總是線程安全的

推而廣之,如果一個類的成員函數可以被多個線程安全調用,只要每個線程使用的是該類的不同實例,那么這個類就是可重入的。如果可以從多個線程安全地調用類的成員函數,即使所有線程都使用類的相同實例,該類也是線程安全的。

注意:?只有當 Qt 類被多個線程使用時,才會被記錄為線程安全。如果函數未標記為線程安全或可重入,則不應在不同線程中使用。如果一個類未標記為線程安全或可重入,則該類的特定實例不得從不同線程訪問。

重入

C++ 類通常是可重入的,原因很簡單,因為它們只訪問自己的成員數據。任何線程都可以調用可重入類實例的成員函數,只要其他線程不能同時調用該類同一實例的成員函數。例如,下面的Counter?類就是可重入類:

class Counter
{
public:Counter() { n = 0; }void increment() { ++n; }void decrement() { --n; }int value() const { return n; }private:int n;
};

該類不是線程安全的,因為如果多個線程試圖修改數據成員n?,結果是未定義的。這是因為++?和--?操作符并不總是原子性的。事實上,它們通常擴展為三條機器指令:

  1. 將變量值載入寄存器。
  2. 遞增或遞減寄存器的值。
  3. 將寄存器的值存儲回主內存。

如果線程 A 和線程 B 同時加載變量的舊值、遞增寄存器并將其存儲回去,那么它們最終會互相覆蓋,而變量只會遞增一次!

導致類不可重入的典型設計模式

  • 使用靜態數據成員或全局狀態
    • 如果類依賴靜態變量或全局資源,多個實例或線程共享這些狀態時可能引發沖突。
  • 單例模式未正確實現線程安全
    • 單例類若在初始化時未加鎖,多線程可能創建多個實例,破壞單例語義。
  • 未保護共享外部資源
    • 類若操作文件、數據庫連接等外部資源時未加鎖,多線程訪問會導致資源沖突。
  • 依賴非線程安全的第三方庫
    • 若類封裝了非線程安全的第三方 API,直接暴露給多線程環境會導致不可重入。
  • 成員函數修改共享內部狀態
    • 若類的成員函數修改共享的成員變量,且未同步,多線程調用會破壞狀態。
    • 比如緩存類(不可沖入):多線程調用?add()?可能導致?std::map?內部狀態損壞。
    • class Cache {
      private:std::map<std::string, std::string> data_;
      public:void add(const std::string& key, const std::string& value) {data_[key] = value;  // 多線程寫入可能破壞 map 結構}
      };

線程安全

顯然,訪問必須序列化:線程 A 必須不間斷(原子地)執行步驟 1、2、3,然后線程 B 才能執行相同的步驟;反之亦然。讓類具有線程安全的簡單方法是使用QMutex?保護對數據成員的所有訪問:

class Counter
{
public:Counter() { n = 0; }void increment() { QMutexLocker locker(&mutex); ++n; }void decrement() { QMutexLocker locker(&mutex); --n; }int value() const { QMutexLocker locker(&mutex); return n; }private:mutable QMutex mutex;int n;
};

QMutexLocker?類會在構造函數中自動鎖定互斥體,并在函數結束調用析構函數時解除鎖定。鎖定互斥確保來自不同線程的訪問將被序列化。mutex?數據成員使用mutable?限定符聲明,因為我們需要在value()?中鎖定和解鎖互斥體,而 是一個常量函數。

Qt 類注意事項

許多 Qt 類都是可重入的,但它們并不是線程安全的,因為如果讓它們成為線程安全的,就會產生重復鎖定和解鎖QMutex?的額外開銷。例如,QString?是可重入的,但不是線程安全的。您可以安全地同時從多個線程訪問QString?的不同實例,但無法安全地同時從多個線程訪問QString?的同一實例(除非您使用QMutex?保護自己的訪問)。

有些 Qt 類和函數是線程安全的。這些主要是與線程相關的類(如QMutex?)和基本函數(如QCoreApplication::postEvent() )。

注:?多線程領域的術語并不完全標準化。POSIX 使用的可重入和線程安全定義與其 C API 有些不同。在 Qt 中使用其他面向對象的 C++ 類庫時,請務必理解這些定義。

Reentrancy and Thread-Safety | Qt 6.8

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

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

相關文章

Elasticsearch:構建 AI 驅動的搜索體驗

Elasticsearch 介紹 當你開始使用 Elastic 時&#xff0c;你將使用 Elasticsearch Relevance Engine?&#xff08;ESRE&#xff09;&#xff0c;它專為 AI 搜索應用程序提供支持。借助 ESRE&#xff0c;你可以利用一整套開發者工具&#xff0c;包括 Elastic 的文本搜索、向量…

鴻蒙生態開發

鴻蒙生態開發概述 鴻蒙生態是華為基于開源鴻蒙&#xff08;OpenHarmony&#xff09;構建的分布式操作系統生態&#xff0c;旨在通過開放共享的模式連接智能終端設備、操作系統和應用服務&#xff0c;覆蓋消費電子、工業物聯網、智能家居等多個領域。以下從定義與架構、核心技術…

JVM如何處理Java中的精度轉換: 從源碼到字節碼

你好&#xff0c;我是 shengjk1&#xff0c;多年大廠經驗&#xff0c;努力構建 通俗易懂的、好玩的編程語言教程。 歡迎關注&#xff01;你會有如下收益&#xff1a; 了解大廠經驗擁有和大廠相匹配的技術等 希望看什么&#xff0c;評論或者私信告訴我&#xff01; 文章目錄 一…

vue-next-admin修改配置指南

官方文檔地址&#xff1a;vue-next-admin 1.如何開啟側邊欄logo 在scr-layout-navbars-topBar-setings.vue中添加 getThemeConfig.value.isShowLogo true; 設置為true即可默認打開 2.修改側邊欄頂部的logo與文字 先把想要的圖標存到我的項目然后下載 然后把后面的幾個文件拉…

gin學習

gin學習筆記&#xff0c;不僅包含了基本的增刪查改外&#xff0c;還包括參數傳遞&#xff0c;上傳下載&#xff0c;模版、session與中間件等&#xff0c;方便收藏自習可用 文章目錄 獲得個請求get打印字符串get請求xmlget請求跳轉http方法路由可以通過Context的Param方法來獲取…

Flutter運行錯誤:UG! exception in phase ‘semantic analysis‘

最近在Mac Mini M4上通過Android Studio導入Flutter項目并運行&#xff0c;結果一直跑不起來&#xff0c;錯誤日志如下&#xff1a; 執行命令查看版本信息&#xff1a; flutter doctor --verbose通過輸出信息Java version OpenJDK Runtime Environment (build 21.0.41242208…

【計算機網絡運輸層詳解】

文章目錄 一、前言二、運輸層的功能1. 端到端通信2. 復用與分用3. 差錯檢測4. 流量控制5. 擁塞控制 三、運輸層協議&#xff1a;TCP 和 UDP1. TCP&#xff1a;面向連接的可靠傳輸協議2. UDP&#xff1a;無連接的傳輸協議 四、端口號與進程通信1. 端口號分類2. 端口通信模型 五、…

51單片機和STM32 入門分析

51單片機和STM32是嵌入式開發中兩種主流的微控制器&#xff0c;它們在架構、性能、應用場景等方面存在顯著差異。以下是兩者的對比分析及選擇建議&#xff1a; 1. 51單片機與STM32的定義與特點 51單片機 定義&#xff1a;基于Intel 8051內核的8位微控制器&#xff0c;結構簡單…

開源視覺語言模型MiniMax-VL-01:動態分辨率+4M超長文本,性能比肩GPT-4o

在人工智能領域&#xff0c;構建能夠像人類一樣理解、思考和行動的智能體&#xff08;AI Agent&#xff09;一直是研究人員的終極目標之一。而實現這一目標的關鍵在于模型是否具備足夠強大的感知能力、記憶能力和推理能力。近期&#xff0c;國內人工智能公司MiniMax重磅開源了其…

excel 列單元格合并(合并列相同行)

代碼 首先自定義注解CellMerge&#xff0c;用于標記哪些屬性需要合并&#xff0c;哪個是主鍵**&#xff08;這里做了一個優化&#xff0c;可以標記多個主鍵&#xff09;** import org.dromara.common.excel.core.CellMergeStrategy;import java.lang.annotation.*;/*** excel…

flowable適配達夢7 (2.1)

經過第一版的問題解決&#xff0c;后端項目可以啟動&#xff0c;前端頁面也集成進去。 前端在流程設計頁面報錯 之后發現主要是組件中modelerStore這個值沒有 解決方法:在data增加對象 給component/process/designer.vue 中涉及到的每個子組件傳入 :modelerStore“modeler…

Prometheus Exporter系列-Mysql_Exporter一鍵部署

新項目舊項目都需要給研發配置mysql監控&#xff0c;這里mysql監控對應aws 阿里云 騰訊云 華為云的云mysql產品或開源自建mysql。 exporter安裝雖然簡單&#xff0c;經常手動操作不免讓人心煩&#xff0c;一鍵完成省去繁瑣的常規操作。 配置信息對的情況下測試多次都可以正常安…

2025年移動端開發性能優化實踐與趨勢分析

啟動速度優化 本質&#xff1a;縮短首次可見幀渲染時間。 方法&#xff1a; iOS&#xff1a;利用Core ML本地模型輕量化部署&#xff0c;減少云端等待。Android&#xff1a;強制啟用SplashScreen API&#xff0c;通過setKeepOnScreenCondition控制動畫時長。冷啟動需將耗時操…

【MySQL篇】DEPENDENT SUBQUERY(依賴性子查詢)優化:從百秒到秒級響應的四種優化辦法

&#x1f4ab;《博主介紹》&#xff1a;?又是一天沒白過&#xff0c;我是奈斯&#xff0c;從事IT領域? &#x1f4ab;《擅長領域》&#xff1a;??擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對SQLserver、NoSQL(…

全文 - MLIR Toy Tutorial Chapter 1: Toy Language and AST

Toy 語言 本教程&#xff0c;將會借助一個玩具語言來講解&#xff0c;這個語言我們稱其為 Toy。Toy 是一個基于張量的語言&#xff0c;它允許你定義函數&#xff0c;執行一些數學計算&#xff0c;并且打印結果。做這樣的設定&#xff0c;是因為我們希望讓教程保持簡明&#xff…

排序復習_代碼純享

頭文件 #pragma once #include<iostream> #include<vector> #include<utility> using std::vector; using std::cout; using std::cin; using std::endl; using std::swap;//插入排序 //1、直接插入排序&#xff08;穩定&#xff09; void InsertSort(vecto…

CSS語言的雙向鏈表

CSS語言的雙向鏈表 引言 在計算機科學中&#xff0c;數據結構是一個極為重要的概念&#xff0c;而鏈表則是最常見的數據結構之一。鏈表可以分為單向鏈表和雙向鏈表&#xff0c;其中雙向鏈表因其靈活性和高效性而受到廣泛應用。在前端開發的領域&#xff0c;尤其是CSS&#xf…

簡單理解機器學習中top_k、top_p、temperature三個參數的作用

AI系列文章&#xff1a; AWS AI認證考試中經常提及幾個重要的工具介紹 簡單理解機器學習中top_k、top_p、temperature三個參數的作用 用Deepseek Kimi 快速生成高質量的ppt 在機器學習中&#xff0c;top_k、top_p 和 temperature 是用于控制生成模型&#xff08;如語言模型…

紅寶書第十三講:詳解JavaScript核心對象:Array、Object、Date、RegExp

紅寶書第十三講&#xff1a;詳解JavaScript核心對象&#xff1a;Array、Object、Date、RegExp 資料取自《JavaScript高級程序設計&#xff08;第5版&#xff09;》。 查看總目錄&#xff1a;紅寶書學習大綱 一、Object&#xff1a;萬物皆對象的“盒子” Object是JavaScript中…

昆侖技術重構AI大模型落地范式,長期作“加法”迎來國產生態化“拐點”

作者 | 曾響鈴 文 | 響鈴說 DeepSeek的爆火&#xff0c;在業內迅速掀起了一場國產化的變革。“國產大模型國產算力”軟硬協同的范式正在被重構&#xff0c;AI產業國產化的含金量持續提升&#xff0c;越來越多的企業在這一趨勢下加速走上數智化轉型路徑。 其中&#xff0c;以…