前几天我在一个网站上看到一个问题,起初我认为答案很简单,但后来我觉得不是。
如何使用原子指令实现锁?比较和交换是原子检查某物值(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/