C++ 中的幾種鎖機制整理

1. 互斥鎖(std::mutex

? 簡介

  • 最常用的線程同步工具。
  • 保證同一時間只能有一個線程訪問臨界區。

? 使用方式

#include <mutex>std::mutex mtx;void safeFunction() {std::lock_guard<std::mutex> lock(mtx);// 臨界區代碼
}

? 優點

  • 簡單易用。
  • 可配合 std::lock_guardstd::unique_lock 自動釋放鎖。

? 缺點

  • 遇到鎖競爭時,線程會掛起,涉及上下文切換,代價較高。

2. 自旋鎖(Spinlock)

? 簡介

  • 忙等待方式的鎖,線程會在獲取不到鎖時不斷循環嘗試。
  • 適合臨界區執行時間非常短的場景。

? 簡易實現(非標準庫提供)

#include <atomic>class Spinlock {
private:std::atomic_flag flag = ATOMIC_FLAG_INIT;
public:void lock() {while (flag.test_and_set(std::memory_order_acquire)); // 自旋}void unlock() {flag.clear(std::memory_order_release);}
};

? 優點

  • 避免線程上下文切換,性能好于互斥鎖(在鎖競爭低、持有時間短的場景下)。

? 缺點

  • 占用 CPU 忙等,競爭嚴重時效率低。

3. 讀寫鎖(std::shared_mutex

? 簡介

  • 允許多個線程并發讀,但寫操作是獨占的。
  • C++17 起引入 std::shared_mutexstd::shared_lock

? 示例

#include <shared_mutex>std::shared_mutex rw_mutex;void reader() {std::shared_lock<std::shared_mutex> lock(rw_mutex);// 只讀操作
}void writer() {std::unique_lock<std::shared_mutex> lock(rw_mutex);// 寫操作
}

? 優點

  • 提高讀操作并發性,減少讀之間的阻塞。

? 缺點

  • 寫操作依舊是阻塞的;讀多寫少的場景最適合。

4. 原子鎖(基于 std::atomic

? 簡介

  • 利用原子變量實現無鎖同步(lock-free)。
  • 適合輕量級同步,比如計數器、自增等。

? 示例

#include <atomic>std::atomic<int> counter = 0;void increment() {counter.fetch_add(1, std::memory_order_relaxed);
}

? 優點

  • 極高性能;無鎖競爭時幾乎無代價。

? 缺點

  • 僅適用于非常簡單的場景,復雜邏輯使用困難。
  • 易于出錯;難以實現復雜的同步邏輯。

🔚 總結對比

鎖類型是否阻塞性能適用場景是否標準庫支持
互斥鎖通用? C++11
自旋鎖高(短時)臨界區極短,高性能要求? 手動實現
讀寫鎖讀非阻塞讀多寫少場景? C++17
原子鎖極高簡單同步(計數器等)? C++11

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

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

相關文章

Graph Representation Learning【圖最短路徑優化/Node2vec/Deepwalk】

文章目錄 Q1&#xff1a;網絡性質&#xff1a;1.數據讀取與鄰接表構建&#xff1a;2.基本特征和連通性&#xff1a; 算法思路&#xff1a;1. 廣度優先搜索&#xff08;BFS&#xff09;標記前驅:2. 回溯生成所有最短路徑: 實驗結果&#xff1a;復雜度分析&#xff1a; Q2&#x…

MATLAB中的概率分布生成:從理論到實踐

MATLAB中的概率分布生成&#xff1a;從理論到實踐 引言 MATLAB作為一款強大的科學計算軟件&#xff0c;在統計分析、數據模擬和概率建模方面提供了豐富的功能。本文將介紹如何使用MATLAB生成各種常見的概率分布&#xff0c;包括均勻分布、正態分布、泊松分布等&#xff0c;并…

經典算法 (A/B) mod C

(A/B) mod C 問題描述 求(A/B)%C&#xff0c;但由于A和B實在太大了&#xff0c;我們只給出A % C&#xff0c;B % C。 (我們保證給定的A必能被B整除&#xff0c;且gcd(B,C) 1)。 輸入描述 輸入一行三個整數&#xff0c;分別是A % C&#xff0c;B % C&#xff0c;C。 輸出…

大數據技術的主要方向及其應用詳解

文章目錄 一、大數據技術概述二、大數據存儲與管理方向1. 分布式文件系統2. NoSQL數據庫3. 數據倉庫技術 三、大數據處理與分析方向1. 批處理技術2. 流處理技術3. 交互式分析4. 圖計算技術 四、大數據機器學習方向1. 分布式機器學習2. 深度學習平臺3. 自動機器學習(AutoML) 五、…

Deeper and Wider Siamese Networks for Real-Time Visual Tracking

現象&#xff1a; the backbone networks used in Siamese trackers are relatively shallow, such as AlexNet , which does not fully take advantage of the capability of modern deep neural networks. direct replacement of backbones with existing powerful archite…

ubuntu22.04卸載vscode

方法 1&#xff1a;通過 Snap 卸載 VSCode 如果你是通過 Snap 安裝的 VSCode&#xff08;Ubuntu 22.04 默認推薦方式&#xff09;&#xff0c;按照以下步驟卸載&#xff1a; 檢查是否通過 Snap 安裝&#xff1a; bash snap list | grep code如果輸出顯示 code&#xff0c;說明…

OpenCV 背景建模詳解:從原理到實戰

在計算機視覺領域&#xff0c;背景建模是一項基礎且重要的技術&#xff0c;它能夠從視頻流中分離出前景目標&#xff0c;廣泛應用于運動目標檢測、視頻監控、人機交互等場景。OpenCV 作為計算機視覺領域最受歡迎的開源庫之一&#xff0c;提供了多種高效的背景建模算法。本文將深…

Android native崩潰問題分析

最近在做NDK項目的時候&#xff0c;出現了啟動應用就崩潰了&#xff0c;崩潰日志如下&#xff1a; 10:41:04.743 A Build fingerprint: samsung/g0qzcx/g0q:13/TP1A.220624.014/S9060ZCU4CWH1:user/release-keys 10:41:04.743 A Revision: 12 10:41:04.743 A ABI: arm64…

【Shell的基本操作】

文章目錄 一、實驗目的二、實驗環境三、實驗內容3.1 Shell變量與腳本基礎3.2 定制終端提示符&#xff08;PS1變量&#xff09;3.3 文件查找與類型確認&#xff08;find命令&#xff09;3.4 管道命令實戰&#xff08;用戶登錄統計&#xff09;3.5 交互式備份壓縮腳本 四、總結4.…

快速選擇算法:優化大數據中的 Top-K 問題

在處理海量數據時&#xff0c;經常會遇到這樣的需求&#xff1a;找出數據中最大的前 K 個數&#xff0c;而不必對整個數據集進行排序。這種場景下&#xff0c;快速選擇算法&#xff08;Quickselect&#xff09;就成了一個非常高效的解決方案。本文將通過一個 C 實現的快速選擇算…

AQS 基本思想與源碼分析

充分了解 AbstractQueuedSynchronizer 對于深入理解并發編程是有益處的&#xff0c;它是用來構建鎖或者其他同步組件的基礎框架&#xff0c;我們常用的同步工具類如 CountDownLatch、Semaphore、ThreadPoolExecutor、ReentrantLock 和 ReentrantReadWriteLock 內部都用到了它。…

理解位圖算法:使用 C++ 實現高效數據查重

在處理海量數據時&#xff0c;我們常常需要檢查某個元素是否已經存在于集合中。傳統的方法如哈希表或集合容器雖然有效&#xff0c;但在數據量極大的情況下會占用大量內存。這時&#xff0c;位圖算法 (Bitmap) 就成為了一種非常高效的解決方案。本文將通過分析一段使用位圖算法…

數學復習筆記 12

前言 現在做一下例題和練習題。矩陣的秩和線性相關。另外還要復盤前面高數的部分的內容。奧&#xff0c;之前矩陣的例題和練習題&#xff0c;也沒有做完&#xff0c;行列式的例題和練習題也沒有做完。累加起來了。以后還是得學一個知識點就做一個部分的內容&#xff0c;日拱一…

1-10 目錄樹

在ZIP歸檔文件中&#xff0c;保留著所有壓縮文件和目錄的相對路徑和名稱。當使用WinZIP等GUI軟件打開ZIP歸檔文件時&#xff0c;可以從這些信息中重建目錄的樹狀結構。請編寫程序實現目錄的樹狀結構的重建工作。 輸入格式: 輸入首先給出正整數N&#xff08;≤104&#xff09;…

Python爬蟲實戰:研究 RPC 遠程調用機制,實現逆向解密

1. 引言 在網絡爬蟲技術的實際應用中,目標網站通常采用各種加密手段保護其數據傳輸和業務邏輯。這些加密機制給爬蟲開發帶來了巨大挑戰,傳統的爬蟲技術往往難以應對復雜的加密算法。逆向解密作為一種應對策略,旨在通過分析和破解目標網站的加密機制,獲取原始數據。 然而,…

debugfs:Linux 內核調試的利器

目錄 一、什么是 debugfs&#xff1f;二、debugfs 的配置和啟用方式2.1 內核配置選項2.2 掛載 debugfs2.3 Android 系統中的 debugfs 三、debugfs 的典型應用場景3.1 調試驅動開發3.2 內核子系統調試3.3 性能分析 四、常見 debugfs 子目錄與功能示例4.1 /sys/kernel/debug/trac…

lua 作為嵌入式設備的配置語言

從lua的腳本中獲取數據 lua中棧的索引 3 | -1 2 | -2 1 | -3 可以在lua的解釋器中加入自己自定的一些功能,其實沒啥必要,就是為了可以練習下lua

棋牌室臺球室快速接入美團團購接口

北極星平臺從2024年12月份開始慢慢關閉&#xff0c;現在很多開發者反饋北極星token已經不能刷新了&#xff0c;全部遷移到美團團購綜合平臺。 申請這個平臺要求很高 1、保證金費用要15萬起步 2、平臺必須是二級等保和安全產品 &#xff0c;一個二級等保費用10萬起步 所以很多…

開源輕量級地圖解決方案leaflet

Leaflet 地圖&#xff1a;開源輕量級地圖解決方案 Leaflet 是一個開源的 JavaScript 庫&#xff0c;用于在網頁中嵌入交互式地圖。它以輕量級、靈活性和易用性著稱&#xff0c;適用于需要快速集成地圖功能的項目。以下是關于 Leaflet 的詳細介紹和使用指南。 1. Leaflet 的核心…

一個批量文件Dos2Unix程序(Microsoft Store,開源)1.1.0 編碼檢測和預覽

之前的版本是個意思意思&#xff0c;驗證商店發布的&#xff08;其實是我以前自己用的工具&#xff09;&#xff0c;這次把格式檢查和轉換都做上了&#xff0c;功能應該差不多了&#xff0c;還有一些需要小改進的地方。 因為還沒什么用戶嘛&#xff0c;還是保持全功能免費試用。…