В книге Мориса Баха «Дизайн операционной системы 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. был бы помечен как двусвязный список, но без разрешений на создание тегов)