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

时间:2014-03-23 17:50:12

标签: c++ multithreading concurrency locking atomic

我前几天在网站上看到了一个问题,起初我认为答案很简单,但后来我认为不是。

如何使用原子指令实现锁定?比较和交换是原子检查某物的价值的标准方式,但它是为了无锁设计,因此我的困惑....

1 个答案:

答案 0 :(得分:5)

当你说'使用原子指令锁定'时,你可能指的是自旋锁

自旋锁只是一个原子整数(或布尔值),有两个值: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);
    }
};

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