繁体   English   中英

使用原子指令实现C ++锁?

[英]Implement a C++ lock using atomic instructions?

前几天,我在一个网站上看到一个问题,起初我以为答案很琐碎,但后来我以为不是。

如何使用原子指令实现锁? 比较和交换是原子检查某物价值的标准方法,但是它旨在用于无锁设计,因此令我感到困惑。

当您说“使用原子指令的锁”时,您可能指的是自旋锁

自旋锁只是具有两个值的单个原子整数(或布尔值):LOCKED和UNLOCKED。 锁定功能执行原子比较,并在while循环中进行交换,直到它成功将值从UNLOCKED修改为LOCKED为止,此时该线程拥有锁。 解锁功能只是将原子的值重置为UNLOCKED。

class spin_lock
{
    constexpr int UNLOCKED = 0;
    constexpr int LOCKED = 1;

    std::atomic<int> m_value = 0;

public:
    void lock()
    {
        while (true)
        {
            int expected = UNLOCKED;
            if (m_value.compare_exchange_strong(expected, LOCKED))
                break;
        }
    }

    void unlock()
    {
        m_value.store(UNLOCKED);
    }
};

说原子比较和交换指令是用于无锁设计的,这也是不正确的。 它们对于所有形式的同步都非常重要。

暂无
暂无

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

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