并發編程之最小化共享

文章目錄

      • **什么是「最小化共享」?**
      • **為什么要最小化共享?**
      • **如何實現最小化共享?**
        • **1. 線程局部存儲(Thread-Local Storage)**
        • **2. 消息傳遞(Message Passing)**
        • **3. 不可變數據(Immutable Data)**
        • **4. 副本傳遞(Copy-On-Write)**
      • **典型應用場景對比**
      • **設計原則總結**

什么是「最小化共享」?

最小化共享(Minimize Sharing)是并發編程中的核心原則,指在多線程設計中盡量減少線程間共享數據的數量,從而降低數據競爭風險、提升性能、簡化代碼邏輯。其本質是通過設計模式減少或消除對共享資源的直接訪問。


為什么要最小化共享?

  1. 降低鎖競爭:減少共享數據意味著減少需要加鎖的區域,提升并發性能。
  2. 避免數據競爭:共享數據越少,線程間意外干擾的可能性越低。
  3. 簡化代碼:無需處理復雜的同步邏輯,代碼更易維護。

如何實現最小化共享?

以下是常見的實現模式及示例:

1. 線程局部存儲(Thread-Local Storage)
  • 原理:每個線程擁有獨立的數據副本,互不干擾。

  • 適用場景:線程需要獨立計算,無需共享中間結果。

    #include <thread>
    #include <iostream>thread_local int local_counter = 0; // 每個線程獨立副本void worker() {for(int i = 0; i < 1000; ++i) {local_counter++; // 無鎖安全操作}std::cout << "Thread " << std::this_thread::get_id() << " counter: " << local_counter << "\n";
    }int main() {std::thread t1(worker);std::thread t2(worker);t1.join(); t2.join();return 0;
    }
    
2. 消息傳遞(Message Passing)
  • 原理:線程通過消息隊列通信,而非直接共享內存。

  • 適用場景:生產者-消費者模型、任務分發。

    #include <queue>
    #include <thread>
    #include <mutex>
    #include <condition_variable>template<typename T>
    class MessageQueue {
    public:void push(const T& msg) {std::lock_guard<std::mutex> lock(mtx_);queue_.push(msg);cond_.notify_one();}T pop() {std::unique_lock<std::mutex> lock(mtx_);cond_.wait(lock, [this]{ return !queue_.empty(); });T msg = queue_.front();queue_.pop();return msg;}private:std::queue<T> queue_;std::mutex mtx_;std::condition_variable cond_;
    };// 使用示例
    MessageQueue<int> msg_queue;void producer() {for(int i = 0; i < 10; ++i) {msg_queue.push(i); // 發送消息}
    }void consumer() {while(true) {int num = msg_queue.pop(); // 接收消息std::cout << "Received: " << num << "\n";}
    }
    
3. 不可變數據(Immutable Data)
  • 原理:共享數據一旦創建便不可修改,無需同步。

  • 適用場景:配置信息、歷史記錄等只讀數據。

    struct Config {const int max_connections; // 常量const std::string log_path; Config(int mc, std::string lp): max_connections(mc), log_path(std::move(lp)) {}
    };// 全局只讀配置
    const auto global_config = std::make_shared<const Config>(100, "/var/log");
    
4. 副本傳遞(Copy-On-Write)
  • 原理:需要修改數據時創建副本,保持原始數據不變。

  • 適用場景:讀多寫少的數據結構。

    #include <vector>
    #include <mutex>class SafeVector {
    public:// 讀操作:無鎖訪問副本std::vector<int> get_data() const {std::lock_guard<std::mutex> lock(mtx_);return data_; // 返回副本}// 寫操作:修改副本后替換void add(int value) {std::lock_guard<std::mutex> lock(mtx_);auto new_data = data_; // 創建副本new_data.push_back(value);data_.swap(new_data); // 原子替換}private:std::vector<int> data_;mutable std::mutex mtx_;
    };
    

典型應用場景對比

場景傳統共享方式最小化共享方案優勢
計數器統計多個線程累加共享變量(需加鎖)線程局部存儲 + 最終合并無鎖操作,性能高
實時數據處理直接操作共享數據隊列(需同步)消息隊列傳遞數據副本解耦生產消費邏輯
全局配置讀取多線程讀取可能被修改的共享配置只讀不可變數據無需同步,絕對安全
用戶會話管理共享用戶狀態表(需復雜鎖機制)每個連接獨立處理 + 無狀態設計避免鎖競爭,擴展性強

設計原則總結

  1. 能不共享就不共享:優先使用線程獨立數據。
  2. 必須共享則只讀:通過不可變數據減少同步需求。
  3. 讀寫分離:寫操作通過副本或消息隊列隔離。
  4. 異步化處理:用消息傳遞代替直接共享內存。

通過最小化共享,可以構建更高效、更健壯的并發系統,減少多線程編程中的常見陷阱。

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

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

相關文章

通信之光纖耦合器

以下是關于光纖耦合器的詳細介紹&#xff1a; 定義與原理 - 定義&#xff1a;光纖耦合器是一種能使傳輸中的光信號在特殊結構的耦合區發生耦合&#xff0c;并進行再分配的器件&#xff0c;也叫分歧器、連接器、適配器、光纖法蘭盤。 - 原理&#xff1a;利用不同光纖面緊鄰光纖芯…

自然語言模型的演變與未來趨勢:從規則到多模態智能的跨越

自然語言模型的演變與未來趨勢&#xff1a;從規則到多模態智能的跨越 自然語言處理(NLP)作為人工智能領域最具挑戰性的分支之一&#xff0c;在過去幾十年經歷了翻天覆地的變化。從最初基于規則的系統到如今擁有萬億參數的大型語言模型(LLMs)&#xff0c;這一技術革新不僅徹底改…

筆記本電腦更換主板后出現2203:System configuration is invalid,以及2201、2202系統錯誤的解決

筆記本電腦更換主板后啟動出現2203:System configuration is invalid,以及2201、2202系統錯誤的解決 自用的一臺ThinkpadT490筆記本電腦 ,由于主板故障,不得不更換主板,通過某寶購置主板后進行了更換。 具體拆卸筆記本可搜索網絡視頻教程。 注意: 在更換主板時,注意先拍…

JavaScript中的觀察者模式

以下是關于 觀察者模式(Observer Pattern) 的全面梳理,涵蓋核心概念、實現方式、應用場景及注意事項,幫助我們掌握這一解耦事件通知與處理的經典設計模式: 一、觀察者模式基礎 1. 核心概念 定義:定義對象間 一對多 的依賴關系,當被觀察對象(Subject)狀態變化時,自動…

RAG基建之PDF解析的“流水線”魔法之旅

將PDF文件和掃描圖像等非結構化文檔轉換為結構化或半結構化格式是人工智能的關鍵部分。然而,由于PDF的復雜性和PDF解析任務的復雜性,這一過程顯得神秘莫測。 在RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”與“陷阱”中,我們介紹了PDF解析的主要任務,對現…

【Linux】GDB調試指南

一、GDB基礎 1. 啟動調試 gdb ./your_program # 啟動調試 gdb --args ./prog arg1 # 帶參數啟動 gdb -p <pid> # 附加到正在運行的進程 2. 斷點管理 b main # 在main函數設斷點 b file.c:20 # 在file.c第20行設斷點 b *0x4005a…

Android面試總結之Glide源碼級理解

當你的圖片列表在低端機上白屏3秒、高端機因內存浪費導致FPS腰斬時&#xff0c;根源往往藏在Glide的內存分配僵化、磁盤混存、網絡加載無優先級三大致命缺陷中。 本文從阿里P8級緩存改造方案出發&#xff0c;結合Glide源碼實現動態內存擴容、磁盤冷熱分區、智能預加載等黑科技&…

驅動開發系列49 - 搭建 Vulkan 驅動調試環境(編譯 mesa 3D)- Ubuntu24.04

一:搭建Vulkan運行環境 安裝vulkan依賴包: 1. sudo apt install vulkan-tools 2. sudo apt install libvulkan-dev 3. sudo apt install vulkan-utility-libraries-dev spirv-tools 4. sudo apt install libglfw3-dev libglm-dev 5. sudo apt install libxxf86vm-dev libxi-…

深度學習——圖像余弦相似度

計算機視覺是研究圖像的學問&#xff0c;在圖像的最終評價時&#xff0c;往往需要用到一些圖像相似度的度量指標&#xff0c;因此&#xff0c;在本文中我們將詳細地介紹原生和調用第三方庫的計算圖像余弦相似度的方法。 使用原生numpy實現 import numpy as npdef image_cosin…

項目代碼第8講【數據庫基礎知識】:SQL(DDL、DML、DQL、DCL);函數(聚合、字符串、數值、日期、流程);約束;多表查詢;事務

黑馬程序員 MySQL數據庫入門到精通&#xff0c;從mysql安裝到mysql高級、mysql優化全囊括_嗶哩嗶哩_bilibili 一、數據庫相關概念 1、主流的關系型數據庫都支持SQL語言——SQL語言可以操作所有的關系型數據庫 像MySQL、Oracle Database、Microsoft SQL Server、IBM Db2等主流的…

如何在阿里云linux主機上部署Node.Js

在阿里云的Linux服務器上搭建Node.js編程環境可以通過以下步驟完成。這里以常見的 Ubuntu/CentOS 系統為例&#xff0c;提供兩種安裝方式&#xff08;包管理器、NVM多版本管理&#xff09;&#xff1a; 一、通過包管理器安裝&#xff08;適合快速安裝指定版本&#xff09; 1. …

Python爬蟲:開啟數據抓取的奇幻之旅(一)

目錄 一、爬蟲初印象&#xff1a;揭開神秘面紗? 二、工欲善其事&#xff1a;前期準備? &#xff08;一&#xff09;Python 環境搭建? 1.下載 Python 安裝包&#xff1a;? 2.運行安裝程序&#xff1a;? 3.配置環境變量&#xff08;若自動添加失敗&#xff09;&#x…

機器學習——集成學習框架(GBDT、XGBoost、LightGBM、CatBoost)、調參方法

一、集成學習框架 對訓練樣本較少的結構化數據領域&#xff0c;Boosting算法仍然是常用項 XGBoost、CatBoost和LightGBM都是以決策樹為基礎的集成學習框架 三個學習框架的發展是&#xff1a;XGBoost是在GBDT的基礎上優化而來&#xff0c;CatBoost和LightGBM是在XGBoost的基礎上…

第十五章:Python的Pandas庫詳解及常見用法

在數據分析領域&#xff0c;Python的Pandas庫是一個不可或缺的工具。它提供了高效的數據結構和數據分析工具&#xff0c;使得數據處理變得簡單而直觀。本文將詳細介紹Pandas庫的基本功能、常見用法&#xff0c;并通過示例代碼演示如何使用Pandas進行數據處理。最后&#xff0c;…

【Python桌面應用】PySide6 界面開發完全指南

文章目錄 1. 引言2. PySide6 簡介與安裝2.1 什么是PySide62.2 PySide6 vs. PyQt62.3 安裝PySide62.4 開發環境配置建議 3. Qt 設計原理3.1 Qt對象模型3.2 信號與槽機制3.3 Qt坐標系統3.4 Qt樣式表(QSS) 4. 創建第一個應用4.1 基本應用結構4.2 主窗口與應用生命周期4.3 使用面向…

用 pytorch 從零開始創建大語言模型(三):編碼注意力機制

從零開始創建大語言模型&#xff08;Python/pytorch &#xff09;&#xff08;三&#xff09;&#xff1a;編碼注意力機制 3 編碼注意力機制3.1 建模長序列的問題3.2 使用注意力機制捕捉數據依賴關系3.3 通過自注意力關注輸入的不同部分3.3.1 一個沒有可訓練權重的簡化自注意力…

Spring中的IOC及AOP概述

前言 Spring 框架的兩大核心設計思想是 IOC&#xff08;控制反轉&#xff09; 和 AOP&#xff08;面向切面編程&#xff09;。它們共同解決了代碼耦合度高、重復邏輯冗余等問題。 IOC&#xff08;控制反轉&#xff09; 1.核心概念 控制反轉&#xff08;Inversion of Control…

STM32_HAL開發環境搭建【Keil(MDK-ARM)、STM32F1xx_DFP、 ST-Link、STM32CubeMX】

安裝Keil(MDK-ARM)【集成開發環境IDE】 我們會在Keil(MDK-ARM)上去編寫代碼、編譯代碼、燒寫代碼、調試代碼。 Keil(MDK-ARM)的安裝方法&#xff1a; 教學視頻的第02分03秒開始看。 安裝過程中請修改一下下面兩個路徑&#xff0c;避免占用C盤空間。 Core就是Keil(MDK-ARM)的…

python 第三方庫 - dotenv讀取配置文件

.env 文件是一種用于存儲環境變量的配置文件&#xff0c;常用于項目的運行環境設置。環境變量是操作系統層面的一些變量&#xff0c;它們可以被應用程序訪問和使用&#xff0c;通常包含敏感信息或特定于環境的配置&#xff0c;如數據庫連接信息、API 密鑰、調試模式等。 安裝p…