用原子指令实现C++锁?
前几天我在一个网站上看到一个问题,起初我认为答案很琐碎,但后来我认为答案并不重要用原子指令实现C++锁?,c++,multithreading,concurrency,locking,atomic,C++,Multithreading,Concurrency,Locking,Atomic,前几天我在一个网站上看到一个问题,起初我认为答案很琐碎,但后来我认为答案并不重要 如何使用原子指令实现锁?比较和交换是原子式检查某物价值的标准方法,但它旨在用于无锁设计,因此我感到困惑 当你说“使用原子指令的锁”时,你可能指的是自旋锁 自旋锁只是一个原子整数或布尔值,有两个值:锁定和解锁。锁定函数在while循环中执行原子比较和交换,直到它成功地将值从UNLOCKED修改为LOCKED,此时该线程拥有锁。unlock函数只是将原子的值重置回UNLOCKED class spin_lock {
如何使用原子指令实现锁?比较和交换是原子式检查某物价值的标准方法,但它旨在用于无锁设计,因此我感到困惑 当你说“使用原子指令的锁”时,你可能指的是自旋锁 自旋锁只是一个原子整数或布尔值,有两个值:锁定和解锁。锁定函数在while循环中执行原子比较和交换,直到它成功地将值从UNLOCKED修改为LOCKED,此时该线程拥有锁。unlock函数只是将原子的值重置回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);
}
};
说原子比较和交换指令用于无锁设计也是不正确的;它们对所有形式的同步都非常重要。当你说“使用原子指令的锁”时,你可能指的是自旋锁 自旋锁只是一个原子整数或布尔值,有两个值:锁定和解锁。锁定函数在while循环中执行原子比较和交换,直到它成功地将值从UNLOCKED修改为LOCKED,此时该线程拥有锁。unlock函数只是将原子的值重置回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);
}
};
说原子比较和交换指令用于无锁设计也是不正确的;它们对所有形式的同步都非常重要。锁通常由CAS实现,原子提供CAS。那么问题是什么呢?你是说std::lock_guard是对我的问题的一个公平的回答?这里的问题是锁定通常涉及任务之间的切换。比较和交换足以检测是否已声明互斥。阻止当前进程,让另一个进程运行,并在互斥器可用时切换回当前进程,这需要了解所涉及的操作系统。我确实认为这是一个措词不当的问题……锁通常由CAS实现,而atomics提供CAS。那么问题是什么呢?你是说std::lock_guard是对我的问题的一个公平的回答?这里的问题是锁定通常涉及任务之间的切换。比较和交换足以检测是否已声明互斥。阻塞当前进程,让另一个进程运行,并在互斥器可用时切换回当前进程,这需要了解所涉及的操作系统。我确实认为这是一个措词不当的问题……因为CAS指令在循环中,使用compare\u exchange\u-Law不是更有效吗?因为CAS指令在循环中,使用比较交换不是更有效吗?