▶
Fig 2 — Thread Helping Protocol (read_internal)
Thread A
MCAS initiator
Thread B
reader / helper
Cell addr
Atomic.t
①
CAS(addr, Value v, Word wd)
Word wd
②
Atomic.get addr
sees Word wd
③
B calls mcas_desc(wd.parent)
↳ helps A complete its MCAS (not_self = true, status = Active)
④
CAS(status, Active, Successful)
⑤
retry → logical_value(wd)
returns new_value
Key invariant: any thread reading a Word descriptor must help the owner complete before returning a value — guarantees wait-freedom of reads