[英]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.