std::atomic_flag 和 std::lock_guard
std::atomic_flag and std::lock_guard
由于 std::lock_guard
不适用于 std::atomic_flag
我已经实现了自己的版本:
class atomic_guard {
public:
inline atomic_guard(std::atomic_flag& lock) : lock(lock) {
while (this->lock.test_and_set()) {
/* spin */
};
};
inline ~atomic_guard() {
this->lock.clear();
};
private:
std::atomic_flag& lock;
};
这似乎工作正常。问题是:这是为 std::atomic_flag
实施 RAII 的正确方法吗?还有一个内置的防护装置吗?如果不是,为什么?专业化 std::lock_guard<std::atomic_flag>
看起来很自然。
您将 atomic_guard
用作独立的互斥体类似物是正确的,尽管有些不寻常。
无法将 std::atomic_flag
直接与 std::lock_guard
一起使用,因为 std::lock_guard
模板管理互斥锁,而 std::atomic_flag
是(低级)原子布尔类型。
可以与 std::lock_guard
一起使用的互斥锁实现必须提供成员函数 lock
和 unlock
并且可以像这样实现:
class my_mutex {
std::atomic_flag flag{ATOMIC_FLAG_INIT};
public:
void lock()
{
while (flag.test_and_set());
}
void unlock()
{
flag.clear();
}
};
请注意,这是一个非常基本且低效的互斥实现,但它与 std::lock_guard
:
兼容
my_mutex mtx;
std::lock_guard<my_mutex> lck{mtx};
由于 std::lock_guard
不适用于 std::atomic_flag
我已经实现了自己的版本:
class atomic_guard {
public:
inline atomic_guard(std::atomic_flag& lock) : lock(lock) {
while (this->lock.test_and_set()) {
/* spin */
};
};
inline ~atomic_guard() {
this->lock.clear();
};
private:
std::atomic_flag& lock;
};
这似乎工作正常。问题是:这是为 std::atomic_flag
实施 RAII 的正确方法吗?还有一个内置的防护装置吗?如果不是,为什么?专业化 std::lock_guard<std::atomic_flag>
看起来很自然。
您将 atomic_guard
用作独立的互斥体类似物是正确的,尽管有些不寻常。
无法将 std::atomic_flag
直接与 std::lock_guard
一起使用,因为 std::lock_guard
模板管理互斥锁,而 std::atomic_flag
是(低级)原子布尔类型。
可以与 std::lock_guard
一起使用的互斥锁实现必须提供成员函数 lock
和 unlock
并且可以像这样实现:
class my_mutex {
std::atomic_flag flag{ATOMIC_FLAG_INIT};
public:
void lock()
{
while (flag.test_and_set());
}
void unlock()
{
flag.clear();
}
};
请注意,这是一个非常基本且低效的互斥实现,但它与 std::lock_guard
:
my_mutex mtx;
std::lock_guard<my_mutex> lck{mtx};