c++11总结21——atomic_flag
1. 頭文件
#include <atomic>2. 功能
是原子布爾類型,它保證是無鎖的(lock-free),且不提供加載或存儲操作。
3. 成員函數
| 構造函數 |
說明:拷貝構造函數和賦值函數被禁用,不允許從一個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 對象在創建時處于 clear 狀態,即標志為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(后續作補充):
| memory_order_relaxed | Relaxed |
| memory_order_consume | Consume |
| memory_order_acquire | Acquire |
| memory_order_release | Release |
| memory_order_acq_rel | Acquire/Release |
| memory_order_seq_cst | Sequentially 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: guid主分区表损坏如何处理_恢复gui
- 下一篇: 负数除以正数余数如何求_负数除正数的余数