MauriceBachのTheDesignof the Unix Operating Systemには、作成中にコンテキストスイッチが原因で二重リンクリストが破棄される可能性があることを示す例があります。(彼は、このような重要なコード領域でプロセッサレベルを上げることでこれを防ぐことができると言い続けていますが、そもそも問題を示しようとする彼の推論を理解するのに苦労しています)彼に含まれるサンプルコードは次のとおりです。次のとおりです。
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 | | |
^
\ /
-----------------------
ロジックをウォークスルーしようとしていますが、コードが示されているように二重リンクリストが壊れてしまう理由がわかりません。誰かがこの問題を引き起こすためにコンテキストスイッチ中に何が起こっているのか説明できますか?
(psは二重リンクリストとしてタグ付けされますが、タグ作成権限はありません)