2

例如,假设您在整数标志上使用原子自旋锁,以确保只有一个线程修改互斥锁在任何给定时间维护的等待队列。当一个线程试图锁定互斥锁时,我们希望它在阻塞自己之前将自己加入队列并将标志设置为零,并且解锁器将线程从队列中出列并将其设置为可运行。

考虑只存在两个线程,一个锁定,另一个同时释放互斥锁。如果锁定器在将自己添加到队列并将标志设置为零(但尚未阻止自身)之后被抢占,然后解锁器尝试出队并使线程可运行,则它不会有用,因为线程还没有自己屏蔽了。所以 make-runnable 调用会很浪费,但更重要的是,locker 线程会在此之后阻塞自己,并永远保持阻塞状态。

这种原子性是如何实现的以确保正确性?可以在条件变量中想象类似的场景,释放互斥锁并阻塞自身。

4

0 回答 0