头文件  #include<atomic>

std::atomic_flag 是原子布尔类型,但不同于 std::atomic<bool> , std::atomic_flag 不提供加载或存储操作。因为是无锁的。只提供test_and_set和clear方法。

成员函数

test_and_set原子地设置其为true,并返回其先前值
clear原子地设置其标志为false

ATOMIC_FLAG_INIT:

std::atomic_flag v = ATOMIC_FLAG_INIT;  // 用于初始化 std::atomic_flag 以清除(置 false )状态的初始化器。

直接看个实例 

#include <thread>
#include <vector>
#include <iostream>
#include <atomic>

std::atomic_flag lock = ATOMIC_FLAG_INIT;

void f(int n)
{
    while (lock.test_and_set(std::memory_order_acquire)) // 尝试获得锁
    {
        std::cout << "wait form thread " << n << std::endl;
    }
    std::cout << "thread " << n << " starts working" << std::endl;
}

void g(int n)
{
    std::cout << "thread " << n << " is going to start" << std::endl;
    lock.clear();
    std::cout << "thread " << n << " starts working" << std::endl;
}

int main()
{
    lock.test_and_set();
    std::thread t1(f, 1);
    std::thread t2(g, 2);

    t1.join();
    t2.join();
}

运行结果如下:

atomic还可以用来封装互斥锁:

void lock(atomic_flag *lock) { while { lock.test_and_set(); } }
void unlock(atomic_flag *lock) { lock.clear(); }

这样就可以通过lock和unlock操作,像往常一样互斥地访问临界区了。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐