Have read and write operations. They store integers. Initial state is 0.
Reads return the value from the last finished write.
Reads return the value from the last finished write or the value concurrently written.
Each operation executes in a particular point in time.
A multivalued MRMW atomic register can be wait-free implemented with binary SRSW safe registers.
Let Reg[1, .., N] be an array of SRSW registers.
fn read()
return Reg[i]
fn write(v)
for j in 1:N
Reg[j] = v
This also works for multi-valued registers and regular ones.
Let Reg be a safe register
fn read()
return Reg
fn write(v)
if old != v
Reg = v
old = v
Let Reg[1, …, M] init to [1, 0, …, 0]
fn read()
for j in 1:M
if Reg[j] == 1
return j
fn write(v)
Reg[v] = 1
for j in rev(1:(v-1))
Reg[j] = 0
Let Reg be a regular SRSW
fn read()
(t', x') = Reg
if t’ > t
t = t'
x = x'
return x
fn write(v)
t = t+1
Reg = (t, v)
We assume there are N readers. Let RReg[(1, 1), (1, 2), …, (N, N)] be N*N SRSW atomic registers for readers to communicate. Let WReg[1, …, N] be SRSW atomic registers.
fn read()
for j in 1:N
(t[j], x[j]) = RReg[i, j]
(t[0], x[0]) = WReg[i]
(t, x) = highest(t[..], x[..])
for j in 1:N
RReg[j, i] = (t, x)
return x
fn write(v)
t1 = t1 + 1
for j in 1:N
WReg[j] = (t1, v)
Let Reg[1, …, N] be MRSW atomic registers.
fn read()
for j in 1:N
(t[j], x[j]) = Reg[j]
(t, x) = highest(t[..], x[..])
return x
fn write(v)
for j in 1:N
(t[j], x[j]) = Reg[j]
(t, x) = highest(t[..], x[..])
t = t + 1
Reg[i] = (t, v)
Theorem: there is no wait-free algorithm that implements a SRSW atomic register that uses a finite number of bounded SRSW regular registers where the base registers are only written by the writer.
To prove we simplify the problem WLOG:
Theorem: there is no wait-free algorithm that implements a MRSW atomic register using many SRSW atomic registers where the base registers can only be written by the writer.
fn read()
sum = 0
for j in 1:N
sum = sum + Reg[j]
return sum
fn inc()
Reg[i] = Reg[i] + 1
fn collect()
for j in 1:N
x[j] = Reg[j]
return x
fn scan()
t1 = collect()
t2 = t1
while true
t3 = collect()
if t3 == t2
return t3
for j in 1:N
if t3[j].2 >= t1[j].2 + 2
return t3[j].3
t2 = t3
fn update(v)
ts = ts + 1
Reg[i] = (v, ts, scan())
Given that t registers might fail.
Reg[1..t+1] MRSW responsive registers.
fn write(v)
for j in 1:t+1
Reg[j] = v
fn read()
for j in t+1 to 1
v = Reg[j]
if v != ⊥
return v
Given that t registers might fail.
Reg[1..2t+1] MRSW non-responsive registers. seq initially set to 1. sn initially set to -1. val initially set to ⊥
fn write(v)
seq = seq + 1
parallel for j in 1:2t+1
Reg[j] = (seq, v)
<<wait for majority of ACKs>>
fn read()
parallel for j in 1:2t+1
(s, v) = Reg[j]
(sn, val) = "(s,v) with the highest s from majority, including old (sn, val)"
return val