《C++11 基于CAS無鎖操作的atomic原子類型》

count++;
count--;

我們知道,++/--操作并不是原子性的,其實對應三條匯編指令來完成的。

  • 讀取:從內存中把變量的值讀取到寄存器
  • 修改:在寄存器里將變量的值+1/-1
  • 寫入:把修改后的值寫入到內存

在單線程環境下,這三個步驟是順序執行的不會有問題。但是在多線程環境下,多個線程可能對同一個變量同時進行++/--操作,從而導致數據競爭的問題。

可以看下面的過程演示。

一:

二:

三:

C++11是通過加鎖來保證++/--操作的原子性的。

std::lock_guard<std::mutext>(mtx);
count++;
std::unlock_guard<std::mutex>(mtx);

互斥鎖是比較重的,臨界區代碼稍稍復雜的情況下建議使用。從系統理論上來講,使用CAS無鎖操作來保證++/--操作的原子性就足夠了,其實并不是不加鎖,只是不在軟件層面上加鎖解鎖,而是在硬件層面上實現的。

#include<iostream>
#include<thread>
#include<list>
#include<atomic>
using namespace std;volatile std::atomic_bool isReady = false;
volatile std::atomic_int myCount = 0;void task()
{while (!isReady){std::this_thread::yield(); // 線程讓出當前的CPU時間片,等待下一次調度}for (int i = 0; i < 100; i++){myCount++;}
}
int main()
{list<std::thread> tlist;for (int i = 0; i < 10; i++){tlist.push_back(std::thread(task));}std::this_thread::sleep_for(std::chrono::seconds(3));isReady = true;for (auto& t : tlist){t.join();}std::cout << "myCount: " << myCount << std::endl;return 0;
}

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

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

相關文章

C++常用多線程模式

文章目錄 1. Fork - Join模式2. Producer - Consumer模式3. Readers - Writers模式4. Work Thread模式5. Actor模式6、 Pipeline模式概述應用場景C實現示例代碼解釋 1. Fork - Join模式 原理&#xff1a;將一個大任務分解為多個子任務&#xff0c;這些子任務在不同的線程中并行…

【時時三省】(C語言基礎)習題2 scanf函數

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省 用下面的scanf函數輸入數據&#xff0c;使a 3&#xff0c;b 7&#xff0c;x 8.5&#xff0c;y 71.82&#xff0c;c1 A&#xff0c;c2 x在鍵盤上應如何輸入? 分析第一個 scanf 函數&…

微信小程序計算屬性與監聽器:miniprogram-computed

小程序框架沒有提供計算屬性相關的 api &#xff0c;但是官方為開發者提供了拓展工具庫 miniprogram-computed。 該工具庫提供了兩個功能&#xff1a; 計算屬性 computed監聽器 watch 一、安裝 miniprogram-computed 在項目的根目錄下&#xff0c;使用如下命令&#xff0c;…

SOFAStack-00-sofa 技術棧概覽

SOFAStack 前言 大家好&#xff0c;我是老馬。 sofastack 其實出來很久了&#xff0c;第一次應該是在 2022 年左右開始關注&#xff0c;但是一直沒有深入研究。 最近想學習一下 SOFA 對于生態的設計和思考。 &#x1f31f; 核心項目 ?? SOFABoot GitHub: sofastack/sofa…

企業模板(QiMoban)是一個專注于企業官網搭建的高效平臺

企業模板(QiMoban.com )是一個專注于為企業提供高效、低成本網站建設解決方案的平臺&#xff0c;主要面向中小企業和創業者。其核心優勢在于幫助用戶快速搭建企業官網&#xff0c;提升品牌形象并拓展業務渠道。以下是關于企業模板(QiMoban.com )的詳細分析&#xff1a; 適用場…

Oracle 數據庫安全評估(DBSAT)簡明過程

下載DBSAT 從這里下載。 實際是從MOS中下載&#xff0c;即&#xff1a;Oracle Database Security Assessment Tool (DBSAT) (Doc ID 2138254.1)。 最新版本為3.1.0 (July 2024)&#xff0c;名為dbsat.zip&#xff0c;近45MB。 $ ls -lh dbsat.zip -rw-rw-r-- 1 oracle oins…

【Linux 維測專欄 1 -- Hung Task 分析與驗證】

文章目錄 Linux Hung Task 簡介1. Hung Task 概述2. D 狀態與 Hung Task3. Hung Task 的工作原理4. Hung Task 的配置5. Hung Task 的典型輸出6. Hung Task 的應用場景7. kernel 配置7.1 編譯選項7.2 參數控制7.3 驗證方法4. 擴展接口 8. 注意事項 Linux Hung Task 簡介 1. Hu…

GCC 預定義宏:解鎖編譯器的隱藏信息

GCC 預定義宏&#xff1a;解鎖編譯器的隱藏信息 在 GCC 編譯器中&#xff0c;有許多內置的預定義宏&#xff0c;它們可以提供編譯環境的信息&#xff0c;如文件名、行號、時間、版本等。這些宏在調試、日志記錄、條件編譯等場景中非常有用。本文將介紹常見的 GCC 預定義宏&…

公鏈開發費用及其構成內容詳析

在區塊鏈技術迅速發展的今天&#xff0c;公鏈&#xff08;Public Blockchain&#xff09;作為去中心化、不可篡改、高安全性的重要應用之一&#xff0c;在金融、供應鏈、游戲等多個領域得到了廣泛應用。然而&#xff0c;開發一條公鏈并非易事&#xff0c;它不僅需要高度專業技能…

Java求101-200之間有多少素數

Java學習筆記 今天看教程看到了這個題&#xff0c;對于一名打過算法競賽的選手還是很簡單的&#xff0c;但由于之前是c組的&#xff0c;所以用java寫一下&#xff0c;練一下手。 代碼&#xff1a; package com.itheima.hello;public class Test1 {public static void main(S…

DM 達夢上的日志挖掘 DBMS_LOGMNR

適用場景 在 DM 中&#xff0c;用戶可以使用 DBMS_LOGMNR 包對歸檔日志進行挖掘&#xff0c;重構出 DDL 和 DML 等操作&#xff0c;并通過獲取的信息進行更深入的分析&#xff1b;同樣&#xff0c;可以對歸檔日志文件進行恢復被誤操作的數據&#xff0c;并進行故障跟蹤&#x…

JavaWeb之WebSocket

目錄 一、 websocket 概念二、WebSocket原理三、WebSocket特點四、WebSocket應用場景五、Websocket基本使用1、創建Websocket對象2、Websocket事件3、Websocket方法4、前端服務程序 六、聊天室案例1、Tomcat版本&#xff1a;8.0.442、Maven 依賴&#xff1a;3、前端代碼4、后端…

Unity Shader編程】之透明物體渲染

以下是針對您提出的關于 Unity Shader 渲染 Pass 的查看方法、多個 Pass 的影響、Pass 的含義&#xff0c;以及 Unity 渲染物體的流程和處理多個透明/半透明/不透明物體的詳細解答。 1. Unity Shader 渲染 Pass 的查看方法 查看 Pass 的方法 通過 Shader 代碼&#xff1a; 打開…

字符指針的三道例題+算法改進

目錄 一.楊氏矩陣 1.初級 2.想把下標帶回來 二.字符串左旋 算法改進 三.判斷是否為字符串旋轉結果 算法改進 四. 3個字符函數 1.strcat 2.strncat 3.strstr 一.楊氏矩陣 數字矩陣&#xff0c;每行從左到右遞增&#xff0c;每列從上到下遞增&#xff0c;編寫程序在矩…

VSCode中搜索插件顯示“提取擴展時出錯。Failed to fetch”問題解決!

大致的問題如下&#xff0c;在VSCode的插件商店搜索插件時提示如下&#xff1a; 導致的情況有以下幾點&#xff1a; 1、代理問題&#xff0c;如果是代理引起的&#xff0c;可以繼續使用代理后也能搜索和安裝插件。 2、還有可能是你的所連接的網絡設置了防火墻&#xff0c;比較…

雙指針(2)—三數之和

文章目錄 題目解析解法&#xff08;排序雙指針&#xff09;&#xff1a;哈希解法附加Java代碼&#xff1a; 力扣題目&#xff1a;三數之和 題目解析 解法&#xff08;排序雙指針&#xff09;&#xff1a; **算法思路&#xff1a;** 本題與兩數之和類似&#xff0c;是?常經典的…

設計一套水產養殖系統

設計一套水產養殖系統 引言 水產養殖在全球糧食安全和經濟發展中日益重要。它不僅為不斷增長的人口提供了重要的蛋白質來源&#xff0c;還在許多地區創造了就業機會并促進了經濟增長 。全球超過一半的人類消費的海產品來自水產養殖&#xff0c;并且這一比例預計將繼續上升 。…

統計可重復列表中的TOP N

文章目錄 方案1&#xff1a;HashMap統計 全排序實現步驟&#xff1a;代碼實現&#xff1a;優缺點&#xff1a; 方案2&#xff1a;HashMap統計 最小堆&#xff08;優先隊列&#xff09;實現步驟&#xff1a;代碼實現&#xff1a;優缺點&#xff1a; 方案3&#xff1a;Java Str…

JVM 知識點梳理

JDK 、JRE、JVM JDK&#xff08; Java Development Kit &#xff09; Java開發工具包 JRE 開發命令工具&#xff08;運行java.exe、編譯javac.exe、javaw.exe&#xff09; JRE&#xff08; Java Runtime Environment &#xff09;Java運行環境 JVM Java核心類庫&#xff08;l…

淘寶歷史價格數據獲取指南:API 與爬蟲方案的合法性與效率對比

引言 在淘寶平臺的購物生態中&#xff0c;消費者希望通過了解商品歷史價格來判斷當前價格是否實惠&#xff0c;商家也需要借助歷史價格數據制定合理的營銷策略、分析市場趨勢。獲取淘寶商品歷史價格數據主要有 API 和爬蟲兩種方案&#xff0c;它們在合法性與效率上存在顯著差異…