我前几天在网站上看到了一个问题,起初我认为答案很简单,但后来我认为不是。
如何使用原子指令实现锁定?比较和交换是原子检查某物的价值的标准方式,但它是为了无锁设计,因此我的困惑....
答案 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);
}
};
说原子比较和交换指令用于无锁设计也是不正确的;它们对所有形式的同步非常重要。