原子型別物件的主要特點就是從不同執行緒訪問不會導致資料競爭(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是無界非阻塞佇列,內部使用單項鍊表實現 其中有...