日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++11总结21——atomic_flag

發(fā)布時間:2023/12/18 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++11总结21——atomic_flag 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 頭文件

#include <atomic>

2. 功能

是原子布爾類型,它保證是無鎖的(lock-free),且不提供加載或存儲操作。

3. 成員函數

構造函數
  • atomic_flag() noexcept = default;
  • atomic_flag (const atomic_flag&T) = delete;
  • operator=?is deleted (non-copyable/moveable)

說明:拷貝構造函數和賦值函數被禁用,不允許從一個atomic_flag對象構造另一個對象

clear原子的設置標志為false
test_and_set原子的設置標志為true,并獲得其先前值
test(c++20)原子的返回標志的值
wait(c++20)阻塞線程直至被提醒且原子值更改
notify_one(c++20)提醒至少一個在原子對象上的等待中阻塞的線程
notify_all(c++20)提醒所有在原子對象上的等待中阻塞的線程

4. ATOMIC_FLAG_INIT宏

如果某個std::atomic_flag 對象使用該宏初始化,那么可以保證該 std::atomic_flag 對象在創(chuàng)建時處于 clear 狀態(tài),即標志為false。

5.?std::atomic_flag::test_and_set

5.1 原型

bool test_and_set (memory_order sync = memory_order_seq_cst) volatile noexcept; bool test_and_set (memory_order sync = memory_order_seq_cst) noexcept;

5.2 作用

test_and_set() 函數檢查 std::atomic_flag 標志,如果 std::atomic_flag 之前沒有被設置過,則設置 std::atomic_flag 的標志,并返回先前該 std::atomic_flag 對象是否被設置過,如果之前 std::atomic_flag 對象已被設置,則返回 true,否則返回 false。

test-and-set 操作是原子的(因此 test-and-set 是原子?read-modify-write?(RMW)操作)。

test_and_set 可以指定 Memory Order(后續(xù)作補充):

Memory Order 值Memory Order 類型
memory_order_relaxedRelaxed
memory_order_consumeConsume
memory_order_acquireAcquire
memory_order_releaseRelease
memory_order_acq_relAcquire/Release
memory_order_seq_cstSequentially consistent

6.?std::atomic_flag::clear()

6.1?原型

void clear (memory_order sync = memory_order_seq_cst) volatile noexcept; void clear (memory_order sync = memory_order_seq_cst) noexcept;

6.2 作用

清除 std::atomic_flag 標志使得下一次調用 std::atomic_flag::test_and_set 返回 false。

7. 自旋互斥

#include <thread> #include <vector> #include <iostream> #include <atomic>std::atomic_flag lock = ATOMIC_FLAG_INIT;void myFunc(int n) {for (int cnt = 0; cnt < 100; ++cnt) {while (lock.test_and_set(std::memory_order_acquire)) // 獲得鎖; // 自旋std::cout << "Output from thread " << n << '\n';lock.clear(std::memory_order_release); // 釋放鎖} }int main() {std::vector<std::thread> v;for (int n = 0; n < 10; ++n) {v.emplace_back(myFunc, n);}for (auto& t : v) {t.join();} }

部分參考:

https://www.cnblogs.com/haippy/p/3252056.html

https://www.apiref.com/cpp-zh/cpp/atomic/atomic_flag.html

總結

以上是生活随笔為你收集整理的c++11总结21——atomic_flag的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。