我实现了 SpinLock 类,代码如下:
struct Node {
int number;
std::atomic_bool latch;
void add() {
lock();
number++;
unlock();
}
void lock() {
bool unlatched = false;
while(!latch.compare_exchange_weak(unlatched, true, std::memory_order_acquire));
}
void unlock() {
latch.store(false , std::memory_order_release);
}
};
我实现了上述的类,并创建了两个线程,每个线程调用同一个Node类实例的add()方法,每个线程调用10 million次。
不幸的是,结果不是20 million。我错过了什么?
lock
时,你需要离开while
循环,这是最糟糕的时间点,因为你需要执行一系列母分支预测。2)lock
函数可能会使在同一虚拟核心上运行的另一个线程挨饿,特别是在超线程CPU上。 - David Schwartz