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 对象在创建时处于 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 值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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值