C 併發程式設計之atomic

2021-10-08 19:24:53 字數 1650 閱讀 3614

原子型別物件的主要特點就是從不同執行緒訪問不會導致資料競爭(data race)。因此從不同執行緒訪問某個原子物件是良性 (well-defined) 行為,而通常對於非原子型別而言,併發訪問某個物件(如果不做任何同步操作)會導致未定義 (undifined) 行為發生。

std::atomic_flag是乙個bool型別的原子變數,它有兩個狀態set和clear,對應著flag為true和false。

std::atomic_flag使用前必須被atomic_flag_init初始化,此時的flag為clear狀態,相當於靜態初始化。

test_and_set():檢查當前flag是否被設定。若己設定直接返回true,若沒設定則將flag置為true ,並返回false。

clear();清除flag標誌,即flag=false。

示例:

#include

// std::cout

#include

// std::atomic, std::atomic_flag, atomic_flag_init

#include

// std::thread, std::this_thread::yield

#include

// std::vector

std::atomic<

bool

>

ready

(false);

// can be checked without being set

std::atomic_flag winner = atomic_flag_init;

// always set when checked

void

count1m

(int id)

// 等待主線程中設定 ready 為 true.

for(

int i =

0; i <

1000000

;++i)

// 計數.

// 如果某個執行緒率先執行完上面的計數過程,則輸出自己的 id.

// 此後其他執行緒執行 test_and_set 是 if 語句判斷為 false,

// 因此不會輸出自身 id.if(

!winner.

test_and_set()

)};int

main()

std::atomic ,udt類不能有任何虛函式或虛基類,以及必須使用編譯器建立的拷貝賦值操作。所有的基類和非靜態資料成員也都需要支援拷貝賦值操作。

std::atomic 的建構函式

std::atomic::operator=() 函式

std::atomic 類模板除了基本型別以外,還針對整形和指標型別做了特化。 特化的 std::atomic 型別支援更多的操作,如 fetch_add, fetch_sub, fetch_and 等。

C 併發程式設計之thread

std thread 在 標頭檔案中宣告,因此使用 std thread 時需要包含 標頭檔案。std thread 構造 注意 可被 joinable 的 thread 物件必須在他們銷毀之前被主線程 join 或者將其設定為 detached.示例 include include include...

C 併發程式設計之std future

簡單地說,std future 可以用來獲取非同步任務的結果,因此可以把它當成一種簡單的執行緒間同步的手段。std future 通常由某個 provider 建立,你可以把 provider 想象成乙個非同步任務的提供者,provider 在某個執行緒中設定共享狀態的值,與該共享狀態相關聯的 st...

併發程式設計之併發佇列

jdk 中提供了一系列場景的併發安全佇列。總的來說,按照實現方式的不同可分為阻塞佇列和非阻塞佇列,前者使用鎖實現,而後者則使用cas 非阻塞演算法實現。1 非阻塞佇列 concurrentlinkedqueue concurrentlinkedqueue是無界非阻塞佇列,內部使用單項鍊表實現 其中有...