【C++】atomic简介
atomic簡介
C++11起提供了atomic,可以使用它定義一個原子類型。
原型:
成員函數:
atomic提供了一些與原子操作有關的成員函數。
| 成員函數 | 說明 |
| store | 原子地以非原子對象替換原子對象的值 |
| load?? ? | 原子地獲得原子對象的值 |
詳見:https://zh.cppreference.com/w/cpp/atomic/atomic
特化成員函數:
所謂特化函數,也就是atomic提供的,可以進行原子操作的函數。使用這些函數,進行的操作,都是原子的。
| 特化成員函數? | 說明 |
| fetch_add | 原子地將參數加到存儲于原子對象的值,并返回先前保有的值 |
| fetch_sub | 原子地進行參數和原子對象的值的逐位與,并獲得先前保有的值 |
| fetch_or | 原子地進行參數和原子對象的值的逐位或,并獲得先前保有的值 |
| fetch_xor | 原子地進行參數和原子對象的值的逐位異或,并獲得先前保有的值 |
| operator++ | 令原子值增加一 |
| operator++(int)? | 令原子值增加一 |
| operator– | 令原子值減少一 |
| operator–(int) | 令原子值減少一 |
| ...... | ...... |
詳見:https://zh.cppreference.com/w/cpp/atomic/atomic
為什么要定義一個原子類型?
舉個例子,int64_t類型,在32位機器上為非原子操作。更新時該類型的值時,需要進行兩步操作(高32位、低32位)。如果多線程操作該類型的變量,且在操作時未加鎖,可能會出現讀臟數據的情況。
解決該問題的話,加鎖,或者提供一種定義原子類型的方法。
使用
定義一個原子類型
自加操作(原子)
讀取變量值(原子)
更新變量(原子)
對于std::memory_order_relaxed 的說明:(C++11多線程 內存序(std::memory_order_relaxed)):
std::memory_order_relaxed在此處可以理解為僅僅保持原子性對于不同的線程,std::memory_order_relaxed內存序不保證讀取值的同步,但若同一個線程已經讀取到某個值a,則后續的load不能讀取到比a更老的值。
參考資料
http://www.cplusplus.com/reference/atomic/atomic/store/
https://zh.cppreference.com/w/cpp/atomic/atomic
————————————————
版權聲明:本文為CSDN博主「林多」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zxc024000/article/details/100767211
總結
以上是生活随笔為你收集整理的【C++】atomic简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【2022最新Java面试宝典】—— M
- 下一篇: android 视频转码需要权限,and