轮询锁定是否是实现关键部分的正确方法?

Fy *_* Zn 3 c locking critical-section

如果我有一个关键部分,我必须实现一个锁定它的方法.我看到了以下变体:

while(lock)
{
    //do nothing
}
lock = true;
// code of critical section
lock = false;
Run Code Online (Sandbox Code Playgroud)

但是,我对它持怀疑态度,因为从理论上讲,几个线程可以执行while(lock)(检查并看到它是假的),并且一起进入临界区,因为while(lock)并且lock = true;不是在一个连续的块中执行.我错了吗?或者这确实是一种不安全的方法?

Jer*_*fin 5

你是对的 - 这不安全.没什么可说的.

编辑:不,真的,真的没有更多关于这个结构的说法.这不是自旋锁,也不像自旋锁.对于自旋锁,你需要一些模糊的东西:

// note: incomplete, not reentrant, not intended for real use
atomic_type spin_lock = 0;

// enter the spin lock:
int prev_value;

while ((prev_value = test_and_set(&spin_lock, 1)) != 0 || spin_lock != 1)
    ;
// code of critical section

// release the spin lock:
test_and_set(&spin_lock, 0);
Run Code Online (Sandbox Code Playgroud)

这里重要的一点是,要进入自旋锁,您需要获取先前的值并以原子方式设置新值.然后,您必须验证对锁写入是否已将其从"非拥有"更改为"拥有"状态.