繁体   English   中英

std :: atomic_flag没有提供加载或存储操作的任何缺点? (旋转锁定示例)

[英]Any disadvantages for std::atomic_flag not providing load or store operations? (Spin-lock example)

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

我的一个问题是术语:“装载或存储操作”是什么意思? 这是否意味着不可能随意读取和修改std::atomic_flag的值?

此外,我想知道,当用于自旋锁时, 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_flag更有效率,还是std::atomic_bool呢? 什么应该用于旋转锁定?

“装载或存储操作”是什么意思? 这是否意味着不可能随意读取和修改std :: atomic_flag的值?

std::atomic_flag不支持正常的存储/加载操作。
它是一种仅修改类型; 即。 如果不执行修改操作,则无法读取std::atomic_flag对象。
通常, std::atomic_flag用作其他操作的构建块。 它的界面非常简单; 它是唯一保证无原子锁定操作的原子类型。 它支持的操作是:

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

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

嗯,问题是,一个自旋锁总是必须在获取锁时修改它的状态。 你根本不能不告诉别人就锁定。
基于std::atomic<bool> lock()实现看起来非常相似:

while (flag.exchange(true)); 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM