c++ - std::atomic_flag 不提供加载或存储操作有什么缺点吗? (自旋锁示例)

标签 c++ c++11 atomic stdatomic

比较 std::atomic_flag std::atomic_bool (又名 std::atomic<bool> ),在我看来 std::atomic_flag只是有一个更简单的界面。它仅提供测试+设置和清除标志,同时 std::atomic_bool还为多个运算符提供重载。

我的一个问题是关于术语的:“加载或存储操作”是什么意思?是不是意味着不能任意读取和修改一个std::atomic_flag的值(value)?

此外,我想知道,std::atomic_bool 可以吗?用于自旋锁时会更快吗?在我看来 std::atomic_flag在自旋锁期间始终必须读取和写入:

while (my_atomic_flag.test_and_set()); // spin-lock

同时 std::atomic_bool只需执行读取操作(假设原子 bool 是无锁实现的):

while (my_atomic_bool); // spin-lock

std::atomic_flag严格来说比 std::atomic_bool 更有效或者它也可以反过来吗?自旋锁应该使用什么?

最佳答案

What is meant by "load or store operations"? Does it mean that it is not possible to arbitrarily read and modify a std::atomic_flag's value?

std::atomic_flag 不支持正常的存储/加载操作.
它是一种只能修改的类型; IE。您无法读取 std::atomic_flag对象而不执行修改操作。
一般来说,std::atomic_flag意味着作为其他操作的构建 block 。它的界面刻意简单;它是唯一保证原子无锁操作的原子类型。 它支持的操作有:

std::atomic_flag::clear()
std::atomic_flag::test_and_set()

有了它,您可以轻松构建自己的自旋锁(尽管通常不推荐):

class my_spinlock {
    std::atomic_flag flag = ATOMIC_FLAG_INIT;
public:

    void lock()
    {
        while(flag.test_and_set());
    }

    void unlock()
    {
        flag.clear();
    }
};

Furthermore, I am wondering, could a std::atomic_bool be faster when being used for a spin-lock? It seems to me that an std::atomic_flag always must read AND write during a spin-lock

好吧,问题是,自旋锁总是在获取锁时必须修改其状态。你不能在不告诉别人的情况下拿锁。
lock() 的实现基于 std::atomic<bool>看起来非常相似:

while (flag.exchange(true)); 

是否基于std::atomic_flag的自旋锁更快?
在我的平台上,编译器为这两种类型发出相同的程序集,所以我会感到非常惊讶。

关于c++ - std::atomic_flag 不提供加载或存储操作有什么缺点吗? (自旋锁示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52071440/

相关文章:

c++ - boost::atomic 真的可以通过减少多线程系统调用(在互斥/信号量中)的开销来 boost 性能吗?

c - 使用原子操作更新 double 数组

c++ - 在构造函数中初始化静态函数指针

c++ - CodeBlocks 构建不正确

c++ - 编写更通用的指针代码

c++ - 在 C++ 中以递归方式简单地打印 vector 的 STL vector

redis - 有没有办法在redis中以原子方式执行get和set?

c++ - OpenCL:在 CPU 而不是 GPU 上的正确结果:如何正确管理内存?

c++ - 当我尝试转换 Int64 时,poco-library 出现错误的转换异常

c++ - 在 C++ 的纯静态公共(public)接口(interface)上删除复制/赋值运算符是否有意义?