C++11在实现自旋锁时,一般会用atomic_flag
来实现,它有两个成员函数:test_and_set()
和clear()
,看cppreference上的解释看了一头雾水,所以自己在vs里debug了一下。
#include <iostream>
#include <atomic>
using namespace std;
int main() {
std::atomic_flag flag{ ATOMIC_FLAG_INIT };
cout << flag.test_and_set() << endl;
cout << flag.test_and_set() << endl;
cout << endl;
flag.clear();
return 0;
}
首先呢,把flag看作是一个bool类型的变量,通过debug发现,test_and_set()
其实可以看作是两个动作:先test
一下,获得当前的状态作为返回值,然后再set
成true
,只不过这两个操作中间不能被中断;clear()
那就简单了,就是将其设置为false
。
总结一下:
test_and_set()
: 先获取状态作为返回值,然后设置成true(经过这个语句后flag一定是true);
clear()
: 将flag设置为false(经过这个语句后flag一定是false)
实现一个自旋锁:
class SpinLock {
public:
SpinLock() = default;
SpinLock(const SpinLock&) = delete;
SpinLock& operator=(const SpinLock&) = delete;
// 只有从false->true的状态跃迁才能跳出循环
inline void lock() { while (flag_.test_and_set()); }
// 设置成false
inline void unlock() { flag_.clear(); }
private:
std::atomic_flag flag_{ATOMIC_FLAG_INIT};
};