Есть пример в книге Мориса Баха «Дизайн операционной системы Unix».
в котором упоминается, как возможно уничтожить двусвязный список из-за
переключение контекста при его создании. (Далее он говорит, что этому препятствует повышение уровня процессора во время таких критических областей кода, но у меня возникают проблемы с пониманием его рассуждений, которые в первую очередь пытаются показать проблему)
следует:
struct queue {
} *bp, *bp1;
bp1 -> forp = bp -> forp;
bp1 -> backp = bp;
bp -> forp = bp1;
/* consider possible context switch here */
bp1 -> forp -> backp = bp1;
диаграмма, которую он пишет, показывает изначально:
| |
| bp1 |
-> | | -> | |
<- | bp | <- | |
затем, чтобы показать окончательное состояние:
-> | | -> | | -> | |
<- | bp | <- | bp1 | | |
^
\ /
-----------------------
Я пытаюсь пройтись по логике, но я не могу сказать, почему код привел
на сломанный двусвязный список, как показано. Может кто-нибудь объяснить, что происходит
во время переключения контекста, чтобы вызвать эту проблему?
(p.s. Был бы помечен как двусвязный список, но без разрешения на создание тега)