C++原子操作

8.3.5 原子操作

在同一時刻只有唯一的線程對這個資源進行訪問。這有點類似互斥對象對共享資源的訪問的保護,但是原子操作更加接近底層,因而效率更高。

(1)pthread

#include <stdatomic.h>
atomic_int atomicVariable;
atomic_init(&atomicVariable, 0);int value = atomic_load(&atomicVariable);// 原子加載原子變量的值
atomic_store(&atomicVariable, value);// 儲存原子變量
int oldValue = atomic_fetch_add(&atomicVariable, value);//原子加法操作
oldValue = atomic_fetch_sub(&atomicVariable, value);//原子減法

示例代碼:

#include <stdio.h>
#include <stdlib.h>
#include <stdatomic.h>
#include <pthread.h>#define NUM_THREADS 4
#define ITERATIONS 1000000// 全局原子變量
atomic_int sharedVariable = 0;// 線程函數,每個線程對共享變量進行一百萬次的加法操作
void* threadFunc(void* arg) {for (int i = 0; i < ITERATIONS; ++i) {atomic_fetch_add(&sharedVariable, 1);}return NULL;
}int main() {pthread_t threads[NUM_THREADS];// 創建多個線程for (int i = 0; i < NUM_THREADS; ++i) {if (pthread_create(&threads[i], NULL, threadFunc, NULL) != 0) {fprintf(stderr, "Error creating thread\n");exit(EXIT_FAILURE);}}// 等待線程執行完畢for (int i = 0; i < NUM_THREADS; ++i) {if (pthread_join(threads[i], NULL) != 0) {fprintf(stderr, "Error joining thread\n");exit(EXIT_FAILURE);}}// 輸出最終的共享變量值printf("Final value of sharedVariable: %d\n", atomic_load(&sharedVariable));return 0;
}

(2)std::atomic

使用步驟:

#include <atomic>
std::atomic<int> total(0); // 初始化
int value = total.load(); // 加載
total.store(42); //原子儲存
int result = total.fetch_add(5); //加法

示例代碼:

#include <iostream>
#include <thread>
#include <atomic>
#include <time.h>
#include <mutex>
#include <atomic>#define MAX 100000
#define THREAD_COUNT 20// 原子操作
std::atomic_int total(0);void threadTask()
{for (int i = 0; i < MAX; i++){total += 1;total -= 1;}
}int main()
{clock_t start = clock();std::thread t[THREAD_COUNT];for (int i = 0; i < THREAD_COUNT; ++i){t[i] = std::thread(threadTask);}for (int i = 0; i < THREAD_COUNT; ++i){t[i].join();}clock_t finish = clock();std::cout << "result:" << total << std::endl; // 計算結果std::cout << "duration:" << finish - start << "ms" << std::endl; // 計算耗時return 0;
}

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

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

相關文章

Python如何從SQL Server存取數據?

在Python中&#xff0c;你可以使用各種庫來連接和操作 SQL Server 數據庫。一種常用的庫是pyodbc&#xff0c;它是一個用于連接到各種數據庫的開源 Python 庫&#xff0c;包括 SQL Server。以下是連接到 SQL Server 并存取數據的基本步驟&#xff1a; 1、安裝 pyodbc 庫&#…

LANA: A Language-Capable Navigator for Instruction Following and Generation

摘要 最近&#xff0c;視覺語言導航&#xff08;VLN&#xff09;——要求機器人代理遵循導航指令——已經取得了巨大的進步。然而&#xff0c;現有文獻最強調將指令解釋為行動&#xff0c;只提供“愚蠢”的尋路代理。在本文中&#xff0c;我們設計了 LANA&#xff0c;一種支持…

【C++ 異常處理】

C 異常處理 ■ C 異常處理簡介■ throw (拋出異常)■ catch (捕獲異常)■ try&#xff08;&#xff09;■ C 標準的異常 ■ C 異常處理簡介 C 異常處理涉及到三個關鍵字&#xff1a;try、catch、throw。 屬性描述throw當問題出現時&#xff0c;程序會拋出一個異常。這是通過使…

【LeetCode-1143】最長公共子序列(動歸)

目錄 題目描述 解法1&#xff1a;動態規劃 代碼實現 題目鏈接 題目描述 給定兩個字符串 text1 和 text2&#xff0c;返回這兩個字符串的最長公共子序列的長度。 一個字符串的 子序列 是指這樣一個新的字符串&#xff1a;它是由原字符串在不改變字符的相對順序的情況下刪除…

Linux系統這些壓測工具,你用過嗎?

作為一名運維人員,你是否遇到過這種場景?需要用工具測試系統cpu或內存占用高來觸發告警,或者通過壓測測試服務的并發能力。作為運維工程師,也可以通過這些命令復現故障場景。那么通過本文可以讓你掌握常用的測試命令和工具。 更多技術博客,請關注微信公眾號:運維之美 一、…

LIDAR2Camera 手動標定

參考&#xff1a;搞懂了&#xff01;原來激光雷達和相機的內外參是這樣標定的_嗶哩嗶哩_bilibili 代碼下載&#xff1a;SensorsCalibration/lidar2camera at master PJLab-ADG/SensorsCalibration (github.com)

社區店選址評估:利用大數據選址的技巧與策略

在當今數字化的時代&#xff0c;利用大數據進行社區店選址評估已成為一種高效、科學的方法。作為一名開鮮奶吧5年的創業者&#xff0c;我將分享一些利用大數據選址的技巧與策略&#xff0c;幫助你找到最適合的店鋪位置。 1、確定目標商圈 在選址之前&#xff0c;首先要明確自己…

涉及主頁面內嵌iframe中的列表數據的保存

場景&#xff1a;主表 : 附表 1 : m&#xff0c;同一個頁面&#xff0c;共同使用一個保存按鈕進行兩個表的數據保存&#xff0c;頁面中間有個查詢按鈕&#xff0c;可以對子iframe頁面的內容進行刷新 流程項目頁面內嵌了個子iframe&#xff0c;項目頁面表單數據提交保存是一個…

爬蟲的一些小技巧總結

一、在爬蟲中&#xff0c;爬取的數據類型如下 1.document:返回的是一個HTML文檔 2.png:無損的圖片&#xff0c;jpg:壓縮后的圖片,wbep:有損壓縮&#xff0c;比png差&#xff0c;比jpg好 3.avgxml圖像編碼字符串 4.script:腳本文件&#xff0c;依據一定格式編寫的可執行的文…

【大廠AI課學習筆記NO.58】(11)混淆矩陣

混淆矩陣&#xff08;confusion matrix&#xff09;—— 混淆矩陣&#xff08;Confusion Matrix&#xff09;是人工智能領域&#xff0c;特別是在機器學習和深度學習中&#xff0c;用于衡量分類模型性能的重要工具。它通過統計分類模型的真實分類與預測分類之間的結果&#xf…

【python debug】python常見編譯問題解決方法_2

序言 記錄python使用過程中碰到的一些問題及其解決方法上一篇&#xff1a;python常見編譯問題解決方法_1 1. PermissionError: [Errno 13] Permission denied: ‘/lostfound’ 修改前&#xff1a; 修改后&#xff08;解決&#xff09;&#xff1a; 此外&#xff0c;可能文件夾…

leetcode 熱題 100_接雨水

題解一&#xff1a; 按列求&#xff1a;分別考慮每一列的雨水高度&#xff0c;某列的雨水高度只與其左側最高墻和右側最高墻有關&#xff0c;一種情況是該列比左右側的墻都低&#xff0c;則根據木桶效應該列雨水高度為min(左側墻高&#xff0c;右側墻高)-列高&#xff0c;而其余…

智能駕駛及相關零部件攝像頭毫米波雷達激光雷達和芯片滲透率

一、總體情況 乘聯會數據顯示&#xff0c;1月1日至1月28日&#xff0c;全國乘用車廠商新能源車批發銷量為56.7萬輛&#xff0c;同比增長76%&#xff0c;環比下降38%&#xff1b;國內新能源車市場零售銷量為59.6萬輛&#xff0c;同比增長92%&#xff0c;環比下降24%。 二、銷…

考研總計劃(基礎篇)

分為數學&#xff0c;專業課&#xff0c;英語三個部分 數學規劃表 高數基礎&#xff1a;3月初到4月15號 具體實行計劃&#xff1a;分為看課日和寫題日 看課日:早上10點到12點半看課&#xff0c;19:30到21:30繼續看課。 寫題日:早上10點到12點半復習前一天的題目&#xff0…

【word】引用文獻如何標注右上角

一、在Word文檔中引用文獻并標注在右上角的具體步驟如下 1、將光標移動到需要添加文獻標注的位置&#xff1a; 2、在文檔上方的工具欄中選擇“引用”選項&#xff1a; 3、點擊“插入腳注”或“插入尾注”&#xff1a; ①如果選擇的是腳注&#xff0c;則腳注區域會出現在本頁的…

多路轉接之epoll

常用的三個API&#xff1a; epoll_create(); //例如 int epfd epoll(10);創建一棵有10個結點的紅黑樹&#xff0c;注意&#xff1a;這個數只是對內核建議的數值&#xff0c;內核參照這個參數去構建epoll_ctrl();//參數2 op可以取值 EPOLL_CTL_ADD/MOD/DELevents:EPOLLIN/…

Professor教誨-學術筆記1

關于指導學生 自己帶的學生&#xff0c;要把文章從頭到尾檢查好了&#xff0c;再發給professor要至少留給professor一周的時間改文章&#xff0c;太遲了不如放棄DDL要在合作中&#xff0c;充分尊重合作者認真對待向別人求推薦信這件事&#xff0c;別人找你推薦也要慎重&#x…

成為大佬之路--linux軟件安裝使用第000000025篇--linux docker安裝mysql

安裝 1.拉取鏡像 docker pull centos/mysql-57-centos7 2.啟動mysql docker run -di --nametensquare_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 centos/mysql-57-centos7

Pyglet圖形界面版2048游戲——詳盡實現教程(上)

目錄 Pyglet圖形界面版2048游戲 一、色塊展示 二、繪制標題 三、方陣色塊 四、界面布局 五、鍵鼠操作 Pyglet圖形界面版2048游戲 一、色塊展示 準備好游戲數字的背景顏色&#xff0c;如以下12種&#xff1a; COLOR ((206, 194, 180, 255), (237, 229, 218, 255), (23…

常見Vue原理面試題

1. Vue的響應式原理是什么&#xff1f;請詳細說明Object.defineProperty()和Proxy的區別和用法。 響應式原理&#xff1a;Vue中采用了數據劫持的方式&#xff0c;通過Object.defineProperty()函數來監聽數據變化&#xff0c;并在數據變化時觸發對應的更新函數。 Object.define…