原子操作atomic

2021-08-22 02:33:12 字數 1087 閱讀 4059

c++中有atomic類和atomic_flag兩個類,其中atomic類用於定義乙個原子操作,atomic_flag定義一些與原子操作相關的函式

如下操作:

// atomic原子操作.cpp : 定義控制台應用程式的入口點。

一般的操作如上,我們開啟兩個執行緒,定義乙個全域性變數n,定義乙個執行緒函式,想要執行的功能是沒執行一次函式就讓全域性變數n加1,每個執行緒單獨加1000000次,兩個執行緒,我們期望的結果是2000000,但是結果如上圖所示,多次實驗結果不一樣,但是總不會(概率很小)出現我們期望的結果,這是因為,我們對變數n的操作是非原子性的,執行緒a執行++的時候,執行緒b也在執行++,有可能兩個執行緒是對同乙個值進行相同的++操作,這樣最後得出的結果就是執行了一次++操作,所以最後結果會小於200000,。

我們把n定義成乙個原子變數,即在n上的操作是具有原子性的,每個執行緒在執行++操作是不會被另乙個執行緒打斷,只有++執行完畢另乙個執行緒才會執行自己的++動作

// atomic原子操作.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include #include #include using namespace std;

atomicn = 0;//定義n為原子變數

我們把n定義為atomic類的乙個物件,使得在n上的操作具有原子性,如此我們得到的結果就是所期望的值

原子操作 atomic

所謂的原子操作,取的就是 原子是最小的 不可分割的最小個體 的意義,它表示在多個執行緒訪問同乙個全域性資源的時候,能夠確保所有其他的執行緒都不在同一時間內訪問相同的資源。也就是他確保了在同一時刻只有唯一的執行緒對這個資源進行訪問。這有點類似互斥物件對共享資源的訪問的保護,但是原子操作更加接近底層,因...

atomic原子操作

atomic原子操作在一些場景下,相比於其他的併發原語,效能更優 舉個例子 假設你想在程式中使用乙個標誌 flag,比如乙個 bool 型別的變數 來標識乙個定時任務是否已經啟動執行了,你會怎麼做呢?我們先來看看加鎖的方法。如果使用 mutex 和 rwmutex,在讀取和設定這個標誌的時候加鎖,是...

Atomic原子操作類詳解

1 基本介紹 atomic,是一種採用樂觀鎖方式實現執行緒安全的 可以高效保證執行緒安全的去更新基本變數,陣列,引用型別 其實現的底層原理是cas 底層操作邏輯 cas v,o,n 三個值分別是 v記憶體位址存放的實際值 o預期的值 n更新的新值 當v o表示沒有被其他執行緒更改過,沒有衝突進行更新...