代码案例有注解。
#include<thread>
#include<iostream>
using namespace std;
using namespace this_thread;
/*
atomic_flag :无锁的原子类型
1,test_and_set() //如果没有被设置,就设置一下,如果设置了返回true
2,clear() :清除标记 让下一次调用test_and_set()返回false
其他原子类型:用is_lock_free()判断是否无锁
自旋锁: 不用等待,不会引起调用者的休眠,调用者一直循环,等待锁的释放
互斥锁:资源申请者只能进入睡眠状态
*/
atomic_flag flag = ATOMIC_FLAG_INIT; // ATOMIC_FLAG_INIT 大挂号
atomic_flag locks = ATOMIC_FLAG_INIT;
void func1(int n)
{
while (locks.test_and_set(memory_order_acquire))
{
printf("等待中......%d\n", n);
}
printf("线程启动");
}
void func2(int n)
{
printf("线程开始启动:%d\n",n);
this_thread::sleep_for(1ms);
locks.clear();
printf("当前线程结束:%d\n",n);
}
int main()
{
locks.test_and_set();
thread t1(func1,1);
thread t2(func2,2);
t1.join();
t2.join();
return 0;
}