c++11:std::atomic_flag
std::atomic_flag 是原子布尔类型,但不同于 std::atomic , std::atomic_flag 不提供加载或存储操作。只提供test_and_set和clear方法。// 用于初始化 std::atomic_flag 以清除(置 false )状态的初始化器。这样就可以通过lock和unlock操作,像往常一样互斥地访问临界区了。头文件#include
·
头文件 #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操作,像往常一样互斥地访问临界区了。
更多推荐
已为社区贡献7条内容
所有评论(0)