例如,假设您在整数标志上使用原子自旋锁,以确保只有一个线程修改互斥锁在任何给定时间维护的等待队列。当一个线程试图锁定互斥锁时,我们希望它将自己入队并在它阻塞自身之前将该标志设置为零,并将解锁器从队列中取出并将其设置为runnable。
只考虑存在两个线程,一个锁定,另一个同时释放互斥锁。如果锁定器在将自己添加到队列并将标志设置为零(但尚未自行阻止)之后被抢占,然后解锁器尝试出列并使线程可运行,那么因为线程没有,所以它没有用处阻止了自己。因此,make-runnable调用将是浪费,但更重要的是,更衣室线程将在此之后阻塞自身并且将永远被阻止。
如何确保这种原子性以确保正确性?类似的情况可以在条件变量中想象,释放互斥并阻塞自身。