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

标签 c++ multithreading concurrency locking atomic

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

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

最佳答案

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

自旋锁只是一个具有两个值的原子整数(或 bool 值):LOCKED 和 UNLOCKED。锁定函数在 while 循环中进行原子比较和交换,直到它成功地将值从 UNLOCKED 修改为 LOCKED,此时该线程拥有锁。 unlock 函数只是将 atomic 的值重置为 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);
    }
};

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

关于c++ - 使用原子指令实现 C++ 锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22594647/

相关文章:

python - 如何在 celery 任务中锁定变量?

c++11 async<>,可用内核数量未知

c++ - 查找字符串是否包含字符串 vector 的任何一个元素的最佳方法

c++ - 获取 block 设备的大小 Linux/Windows

java - 如何减慢 java 中线程的生成速度?

java - 如果参数化,按需初始化持有者习惯用法仍然安全吗?

c++ - 在 C++ 中通过迭代器循环遍历数组

objective-c - 复制NSMutableArray线程安全吗?

multithreading - 过程宏是否在一个线程中编译?

c - 如何使用指针将从 Pthread 返回的多个数组存储在另一个数组中