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 一起使用的互斥锁实现必须提供成员函数 lockunlock 并且可以像这样实现:

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};