Lock-Free Concurrent Data Structures
Danny Hendler
Ben-Gurion University
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 1
Lock-Free Concurrent Data Structures Danny Hendler Ben-Gurion - - PowerPoint PPT Presentation
Lock-Free Concurrent Data Structures Danny Hendler Ben-Gurion University 1 Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 Key synchronization alternatives 1. Lock-based synchronizaGon 2. Nonblocking algorithms 3. TransacGonal
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 1
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Every thread is guaranteed to complete its operaGon aPer performing a sufficient number of steps.
Some thread is guaranteed to complete its operaGon aPer a sufficient number of steps by threads is taken.
A thread is guaranteed to complete its operaGon aPer performing a sufficient number of steps when running solo.
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 5
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
6
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
n Preliminaries n A simple lock-free stack algorithm
n Michael & Sco] queue algorithm n The Harris-Michael linked list algorithm n EliminaGon-based stack n Discussion & conclusions
7
val next val next
val next atomically
t read from var if (var = expected) { var new return success } else return failure;
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 8
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
val next val next
val next val next
9
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Push(int v, Stack S) 1. n := new NODE ;create node for new stack item 2. n.val := v ;write item value 3. do forever ;repeat until success 4. node top := S.top 5. n.next := top ;next points to current top (LIFO order) 6. if compare&swap(S, top, n) ; try to add new item 7. return ; return if succeeded 8. end do
10
val next val next
val next
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 11
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Pop(Stack S) 1. do forever 2. top := S.top 3. if top = null 4. return empty 5. if compare&swap(S, top, top.next) 6. return-val=top.val 7. free top? 8. return return-val 9. end do
12
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 13
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 14
Invocation Response
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
15
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
16
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
17
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
18
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
19
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
20
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
21
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
22
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
23
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
24
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Push(int v, Stack S) 1. n := new NODE ;create node for new stack item 2. n.val := v ;write item value 3. do forever ;repeat until success 4. node top := S.top 5. n.next := top ;next points to current (LIFO order) 6. if compare&swap(S, top, n) ; try to add new item 7. return ; return if succeeded 8. end do
Upon success
25
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Upon success
Pop(Stack S) 1. do forever 2. top := S.top 3. if top = null 4. return empty 5. if compare&swap(S, top, top.next) 6. return-val=top.val 7. return return-val 8. end do
When empty
26
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
n Preliminaries n A simple lock-free stack algorithm
n Michael & Sco] queue algorithm n The Harris-Michael linked list algorithm n EliminaGon-based stack n Discussion & conclusions
27
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 28
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 29
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 30
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
head tail
31
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
head tail
32
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
head tail
33
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
head tail
34
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
head tail
35
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
36
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 37
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 38
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 39
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
head tail
40
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
head tail
41
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
42
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
43
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
44
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
45
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean enq enq(T value) { (T value) { Node Node node=new Node(value); node=new Node(value); while while ( (true true) { ) { Node last = Node last = tail.get tail.get(); (); Node next = Node next = last.next.get last.next.get(); (); if if (last == (last == tail.get tail.get()) { ()) { if if (next == (next == null null) { ) { if if ( (last.next.compareAndSet last.next.compareAndSet(null null,node ,node) { ) { tail.compareAndSet tail.compareAndSet(last,node last,node); ); return; return; } } } } else else { { tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } } } } } } }
46
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean enq enq(T value) { (T value) { Node Node node=new Node(value); node=new Node(value); while (true) { while (true) { Node last = Node last = tail.get tail.get(); (); Node next = Node next = last.next.get last.next.get(); (); if (last == if (last == tail.get tail.get()) { ()) { if (next == null) { if (next == null) { if ( if (last.next.compareAndSet last.next.compareAndSet(null,node null,node) { ) { tail.compareAndSet tail.compareAndSet(last,node last,node); ); return; return; } } } else { } else { tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } } } } } } }
47
public public boolean boolean enq enq(T value) { (T value) { Node node=new Node(value); Node node=new Node(value); while (true) { while (true) { Node last = Node last = tail.get tail.get(); (); Node next = Node next = last.next.get last.next.get(); (); if (last == if (last == tail.get tail.get()) { ()) { if (next == null) { if (next == null) { if ( if (last.next.compareAndSet last.next.compareAndSet(null,node null,node) { ) { tail.compareAndSet tail.compareAndSet(last,node last,node); ); return; return; } } } else { } else { tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
48
public public boolean boolean enq enq(T value) { (T value) { Node node=new Node(value); Node node=new Node(value); while (true) { while (true) { Node last = Node last = tail.get tail.get(); (); Node next = Node next = last.next.get last.next.get(); (); if (last == if (last == tail.get tail.get()) { ()) { if (next == null) { if (next == null) { if ( if (last.next.compareAndSet last.next.compareAndSet(null,node null,node) { ) { tail.compareAndSet tail.compareAndSet(last,node last,node); ); return; return; } } } else { } else { tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
49
public public boolean boolean enq enq(T value) { (T value) { Node node=new Node(value); Node node=new Node(value); while (true) { while (true) { Node last = Node last = tail.get tail.get(); (); Node next = Node next = last.next.get last.next.get(); (); if (last == if (last == tail.get tail.get()) { ()) { if (next == null) { if (next == null) { if ( if (last.next.compareAndSet last.next.compareAndSet(null,node null,node) { ) { tail.compareAndSet tail.compareAndSet(last,node last,node); ); return; return; } } } else { } else { tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
50
public public boolean boolean enq enq(T value) { (T value) { Node node=new Node(value); Node node=new Node(value); while (true) { while (true) { Node last = Node last = tail.get tail.get(); (); Node next = Node next = last.next.get last.next.get(); (); if (last == if (last == tail.get tail.get()) { ()) { if (next == null) { if (next == null) { if ( if (last.next.compareAndSet last.next.compareAndSet(null,node null,node) { ) { tail.compareAndSet tail.compareAndSet(last,node last,node); ); return; return; } } } else { } else { tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
51
public public boolean boolean enq enq(T value) { (T value) { Node node=new Node(value); Node node=new Node(value); while (true) { while (true) { Node last = Node last = tail.get tail.get(); (); Node next = Node next = last.next.get last.next.get(); (); if (last == if (last == tail.get tail.get()) { ()) { if (next == null) { if (next == null) { if ( if (last.next.compareAndSet last.next.compareAndSet(null,node null,node) { ) { tail.compareAndSet tail.compareAndSet(last,node last,node); ); return; return; } } } else { } else { tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
52
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public T public T deq deq() throws () throws EmptyException EmptyException{ { while while ( (true true) { ) { Node first = Node first = head.get head.get(); (); Node last = Node last = tail.get tail.get(); (); Node next = Node next = first.next.get first.next.get(); (); if if (first == last) { (first == last) { if if (next == (next == null null) { ) { throw new throw new EmptyException EmptyException(); (); } } tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } else else { { T value = T value = next.value next.value; ; if ( if (head.compareAndSet head.compareAndSet(first,next first,next)) )) return value; return value; } } } } } } } }
53
public T public T deq deq() throws () throws EmptyException EmptyException{ { while (true) { while (true) { Node first = Node first = head.get head.get(); (); Node last = Node last = tail.get tail.get(); (); Node next = Node next = first.next.get first.next.get(); (); if (first == last) { if (first == last) { if (next == null) { if (next == null) { throw new throw new EmptyException EmptyException(); (); } } tail.compareAndSet tail.compareAndSet(last,next last,next); ); } else { } else { T value = T value = next.value next.value; ; if ( if (head.compareAndSet head.compareAndSet(first,next first,next)) )) return value; return value; } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
54
public T public T deq deq() throws () throws EmptyException EmptyException{ { while while ( (true true) { ) { Node first = Node first = head.get head.get(); (); Node last = Node last = tail.get tail.get(); (); Node next = Node next = first.next.get first.next.get(); (); if (first == last) { if (first == last) { if (next == null) { if (next == null) { throw new throw new EmptyException EmptyException(); (); } } tail.compareAndSet tail.compareAndSet(last,next last,next); ); } else { } else { T value = T value = next.value next.value; ; if ( if (head.compareAndSet head.compareAndSet(first,next first,next)) )) return value; return value; } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
55
public T public T deq deq() throws () throws EmptyException EmptyException{ { while (true) { while (true) { Node first = Node first = head.get head.get(); (); Node last = Node last = tail.get tail.get(); (); Node next = Node next = first.next.get first.next.get(); (); if if (first == last) { (first == last) { if (next == null) { if (next == null) { throw new throw new EmptyException EmptyException(); (); } } tail.compareAndSet tail.compareAndSet(last,next last,next); ); } else { } else { T value = T value = next.value next.value; ; if ( if (head.compareAndSet head.compareAndSet(first,next first,next)) )) return value; return value; } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
56
public T public T deq deq() throws () throws EmptyException EmptyException{ { while (true) { while (true) { Node first = Node first = head.get head.get(); (); Node last = Node last = tail.get tail.get(); (); Node next = Node next = first.next.get first.next.get(); (); if (first == last) { if (first == last) { if if (next == (next == null null) { ) { throw new throw new EmptyException EmptyException(); (); } } tail.compareAndSet tail.compareAndSet(last,next last,next); ); } else { } else { T value = T value = next.value next.value; ; if ( if (head.compareAndSet head.compareAndSet(first,next first,next)) )) return value; return value; } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
57
public T public T deq deq() throws () throws EmptyException EmptyException{ { while (true) { while (true) { Node first = Node first = head.get head.get(); (); Node last = Node last = tail.get tail.get(); (); Node next = Node next = first.next.get first.next.get(); (); if (first == last) { if (first == last) { if (next == null) { if (next == null) { throw new throw new EmptyException EmptyException(); (); } } tail.compareAndSet tail.compareAndSet(last,next last,next); ); } else { } else { T value = T value = next.value next.value; ; if ( if (head.compareAndSet head.compareAndSet(first,next first,next)) )) return value; return value; } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
58
public T public T deq deq() throws () throws EmptyException EmptyException{ { while (true) { while (true) { Node first = Node first = head.get head.get(); (); Node last = Node last = tail.get tail.get(); (); Node next = Node next = first.next.get first.next.get(); (); if (first == last) { if (first == last) { if (next == null) { if (next == null) { throw new throw new EmptyException EmptyException(); (); } } tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } else else { { T value = T value = next.value next.value; ; if ( if (head.compareAndSet head.compareAndSet(first,next first,next)) )) return value; return value; } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
59
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean enq enq(T value) { (T value) { Node Node node=new Node(value); node=new Node(value); while while ( (true true) { ) { Node last = Node last = tail.get tail.get(); (); Node next = Node next = last.next.get last.next.get(); (); if if (last == (last == tail.get tail.get()) { ()) { if if (next == (next == null null) { ) { if if ( (last.next.compareAndSet last.next.compareAndSet(null null,node ,node) { ) { tail.compareAndSet tail.compareAndSet(last,node last,node); ); return; return; } } } } else else { { tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } } } } } } }
60
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean enq enq(T value) { (T value) { Node Node node=new Node(value); node=new Node(value); while while ( (true true) { ) { Node last = Node last = tail.get tail.get(); (); Node next = Node next = last.next.get last.next.get(); (); if if (last == (last == tail.get tail.get()) { ()) { if if (next == (next == null null) { ) { if if ( (last.next.compareAndSet last.next.compareAndSet(null null,node ,node) { ) { tail.compareAndSet tail.compareAndSet(last,node last,node); ); return; return; } } } } else else { { tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } } } } } } }
Upon success
61
public T public T deq deq() throws () throws EmptyException EmptyException{ { while while ( (true true) { ) { Node first = Node first = head.get head.get(); (); Node last = Node last = tail.get tail.get(); (); Node next = Node next = first.next.get first.next.get(); (); if if (first == last) { (first == last) { if if (next == (next == null null) { ) { throw new throw new EmptyException EmptyException(); (); } } tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } else else { { T value = T value = next.value next.value; ; if ( if (head.compareAndSet head.compareAndSet(first,next first,next)) )) return value; return value; } } } } } } } }
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 62
public T public T deq deq() throws () throws EmptyException EmptyException{ { while while ( (true true) { ) { Node first = Node first = head.get head.get(); (); Node last = Node last = tail.get tail.get(); (); Node next = Node next = first.next.get first.next.get(); (); if if (first == last) { (first == last) { if if (next == (next == null null) { ) { throw new throw new EmptyException EmptyException(); (); } } tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } else else { { T value = T value = next.value next.value; ; if ( if (head.compareAndSet head.compareAndSet(first,next first,next)) )) return value; return value; } } } } } } } }
Upon success
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 63
public T public T deq deq() throws () throws EmptyException EmptyException{ { while while ( (true true) { ) { Node first = Node first = head.get head.get(); (); Node last = Node last = tail.get tail.get(); (); Node next = Node next = first.next.get first.next.get(); (); if if (first == last) { (first == last) { if if (next == (next == null null) { ) { throw new throw new EmptyException EmptyException(); (); } } tail.compareAndSet tail.compareAndSet(last,next last,next); ); } } else else { { T value = T value = next.value next.value; ; if ( if (head.compareAndSet head.compareAndSet(first,next first,next)) )) return value; return value; } } } } } } } }
When empty
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 64
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
n Preliminaries n A simple lock-free stack algorithm
n Michael & Sco] queue algorithm n The Harris-Michael linked list algorithm n EliminaGon-based stack n Discussion & conclusions
65
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
66
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
67
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
68
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
69
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
70
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
71
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
72
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
73
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
74
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 75
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 76
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 77
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 78
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 79
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 80
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 81
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 82
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 83
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
SUCCESS SUCCESS
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 84
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 85
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
CAS
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 86
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
CAS CAS
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 87
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
88
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
89
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
90
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
91
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
92
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
93
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
94
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
95
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
96
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
97
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 98
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 99
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 100
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 101
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
102
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
103
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
104
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
105
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
106
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
107
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
108
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
109
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
110
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
111
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
112
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
113
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
114
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
115
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
116
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
117
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
118
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
119
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean remove(T item) { remove(T item) { Boolean Boolean snip; snip; while while ( (true true) { ) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if if ( (curr.key curr.key != key) { != key) { return return false false; ; } } else else { { Node Node succ succ = = curr.next.getReference curr.next.getReference(); (); snip = snip = curr.next.compareAndSet curr.next.compareAndSet(succ succ, , succ succ, , false false true true); ); if if (!snip) (!snip) continue continue; ; pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, , false false, , false false); ); return return true true; ; }}} }}}
120
public public boolean boolean remove(T item) { remove(T item) { Boolean snip; Boolean snip; while while ( (true true) { ) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if ( if (curr.key curr.key != key) { != key) { return false; return false; } else { } else { Node Node succ succ = = curr.next.getReference curr.next.getReference(); (); snip = snip = curr.next.compareAndSet curr.next.compareAndSet ( (succ succ, , succ succ, false, , false, true); true); if (!snip) continue; if (!snip) continue; pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, false, false); , false, false); return true; return true; }}} }}}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
121
public public boolean boolean remove(T item) { remove(T item) { Boolean snip; Boolean snip; while (true) { while (true) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if ( if (curr.key curr.key != key) { != key) { return false; return false; } else { } else { Node Node succ succ = = curr.next.getReference curr.next.getReference(); (); snip = snip = curr.next.compareAndSet curr.next.compareAndSet ( (succ succ, , succ succ, false, , false, true); true); if (!snip) continue; if (!snip) continue; pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, false, false); , false, false); return true; return true; }}} }}}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
122
public public boolean boolean remove(T item) { remove(T item) { Boolean snip; Boolean snip; while (true) { while (true) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if if ( (curr.key curr.key != key) { != key) { return return false false; ; } } else else { { Node Node succ succ = = curr.next.getReference curr.next.getReference(); (); snip = snip = curr.next.compareAndSet curr.next.compareAndSet(succ succ, , succ succ, false, , false, true); true); if (!snip) continue; if (!snip) continue; pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, false, false); , false, false); return true; return true; }}} }}}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
123
public public boolean boolean remove(T item) { remove(T item) { Boolean snip; Boolean snip; while (true) { while (true) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if ( if (curr.key curr.key != key) { != key) { return false; return false; } else { } else { Node Node succ succ = = curr.next.getReference curr.next.getReference(); (); snip = snip = curr.next.compareAndSet curr.next.compareAndSet(succ succ, , succ succ, , false false, , true true); ); if (!snip) continue; if (!snip) continue; pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, false, false); , false, false); return true; return true; }}} }}}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
124
public public boolean boolean remove(T item) { remove(T item) { Boolean snip; Boolean snip; while (true) { while (true) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if ( if (curr.key curr.key != key) { != key) { return false; return false; } else { } else { Node Node succ succ = = curr.next.getReference curr.next.getReference(); (); snip = snip = curr.next.compareAndSet curr.next.compareAndSet(succ succ, , succ succ, false, , false, true); true); if if (!snip) (!snip) continue continue; ; pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, false, false); , false, false); return true; return true; }}} }}}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
125
public public boolean boolean remove(T item) { remove(T item) { Boolean snip; Boolean snip; while (true) { while (true) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if ( if (curr.key curr.key != key) { != key) { return false; return false; } else { } else { Node Node succ succ = = curr.next.getReference curr.next.getReference(); (); snip = snip = curr.next.compareAndSet curr.next.compareAndSet(succ succ, , succ succ, false, , false, true); true); if (!snip) continue; if (!snip) continue; pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, , false false, , false false); ); return return true true; ; }}} }}}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
126
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean remove(T item) { remove(T item) { Boolean Boolean snip; snip; while while ( (true true) { ) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if if ( (curr.key curr.key != key) { != key) { return return false false; ; } } else else { { Node Node succ succ = = curr.next.getReference curr.next.getReference(); (); snip = snip = curr.next.compareAndSet curr.next.compareAndSet(succ succ, , succ succ, , false false true true); ); if if (!snip) (!snip) continue continue; ; pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, , false false, , false false); ); return return true true; ; }}} }}}
127
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean remove(T item) { remove(T item) { Boolean Boolean snip; snip; while while ( (true true) { ) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if if ( (curr.key curr.key != key) { != key) { return return false false; ; } } else else { { Node Node succ succ = = curr.next.getReference curr.next.getReference(); (); snip = snip = curr.next.compareAndSet curr.next.compareAndSet(succ succ, , succ succ, , false false true true); ); if if (!snip) (!snip) continue continue; ; pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, , false false, , false false); ); return return true true; ; }}} }}}
Upon success
128
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean remove(T item) { remove(T item) { Boolean Boolean snip; snip; while while ( (true true) { ) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if if ( (curr.key curr.key != key) { != key) { return return false false; ; } } else else { { Node Node succ succ = = curr.next.getReference curr.next.getReference(); (); snip = snip = curr.next.compareAndSet curr.next.compareAndSet(succ succ, , succ succ, , false false true true); ); if if (!snip) (!snip) continue continue; ; pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, , false false, , false false); ); return return true true; ; }}} }}}
When returning false
129
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean add(T item) { add(T item) { boolean boolean splice; splice; while while ( (true true) { ) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if if ( (curr.key curr.key == key) { == key) { return return false false; ; } } else else { { Node Node node node = = new new Node(item); Node(item); node.next node.next = = new new AtomicMarkableRef AtomicMarkableRef(curr curr, , false false); ); if if ( (pred.next.compareAndSet pred.next.compareAndSet(curr curr, node, , node, false false, , false false)) { )) {return true return true;} ;} }}} }}}
130
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean add(T item) { add(T item) { boolean boolean splice; splice; while while ( (true true) { ) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if ( if (curr.key curr.key == key) { == key) { return false; return false; } else { } else { Node Node node node = new Node(item); = new Node(item); node.next node.next = new = new AtomicMarkableRef AtomicMarkableRef(curr curr, false); , false); if ( if (pred.next.compareAndSet pred.next.compareAndSet(curr curr, node, false, , node, false, false)) {return true;} false)) {return true;} }}} }}}
131
public public boolean boolean add(T item) { add(T item) { boolean boolean splice; splice; while (true) { while (true) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if ( if (curr.key curr.key == key) { == key) { return false; return false; } else { } else { Node Node node node = new Node(item); = new Node(item); node.next node.next = new = new AtomicMarkableRef AtomicMarkableRef(curr curr, false); , false); if ( if (pred.next.compareAndSet pred.next.compareAndSet(curr curr, node, false, , node, false, false)) {return true;} false)) {return true;} }}} }}}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
132
public boolean add(T item) { public boolean add(T item) { boolean splice; boolean splice; while (true) { while (true) { Window window = find(head, key); Window window = find(head, key); Node pred = window.pred, curr = window.curr; Node pred = window.pred, curr = window.curr; if if (curr.key == key) { (curr.key == key) { return return false false; ; } else { } else { Node node = new Node(item); Node node = new Node(item); node.next = new AtomicMarkableRef(curr, false); node.next = new AtomicMarkableRef(curr, false); if (pred.next.compareAndSet(curr, node, false, if (pred.next.compareAndSet(curr, node, false, false)) {return true;} false)) {return true;} }}} }}}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
133
public public boolean boolean add(T item) { add(T item) { boolean boolean splice; splice; while (true) { while (true) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if ( if (curr.key curr.key == key) { == key) { return false; return false; } else { } else { Node Node node node = = new new Node(item); Node(item); node.next node.next = = new new AtomicMarkableRef AtomicMarkableRef(curr curr, , false false); ); if ( if (pred.next.compareAndSet pred.next.compareAndSet(curr curr, node, false, , node, false, false)) {return true;} false)) {return true;} }}} }}}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
134
public boolean add(T item) { public boolean add(T item) { boolean splice; boolean splice; while (true) { while (true) { Window window = find(head, key); Window window = find(head, key); Node pred = window.pred, curr = window.curr; Node pred = window.pred, curr = window.curr; if (curr.key == key) { if (curr.key == key) { return false; return false; } else { } else { Node node = new Node(item); Node node = new Node(item); node.next = new AtomicMarkableRef(curr, false); node.next = new AtomicMarkableRef(curr, false); if if (pred.next.compareAndSet(curr, node, (pred.next.compareAndSet(curr, node, false false, , false false)) { )) {return true return true;} ;} }}} }}}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
135
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean add(T item) { add(T item) { boolean boolean splice; splice; while while ( (true true) { ) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if if ( (curr.key curr.key == key) { == key) { return return false false; ; } } else else { { Node Node node node = = new new Node(item); Node(item); node.next node.next = = new new AtomicMarkableRef AtomicMarkableRef(curr curr, , false false); ); if if ( (pred.next.compareAndSet pred.next.compareAndSet(curr curr, node, , node, false false, , false false)) { )) {return true return true;} ;} }}} }}}
136
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean add(T item) { add(T item) { boolean boolean splice; splice; while while ( (true true) { ) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if if ( (curr.key curr.key == key) { == key) { return return false false; ; } } else else { { Node Node node node = = new new Node(item); Node(item); node.next node.next = = new new AtomicMarkableRef AtomicMarkableRef(curr curr, , false false); ); if if ( (pred.next.compareAndSet pred.next.compareAndSet(curr curr, node, , node, false false, , false false)) { )) {return true return true;} ;} }}} }}}
Upon success
137
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public boolean boolean add(T item) { add(T item) { boolean boolean splice; splice; while while ( (true true) { ) { Window Window window window = find(head, key); = find(head, key); Node Node pred pred = = window.pred window.pred, , curr curr = = window.curr window.curr; ; if if ( (curr.key curr.key == key) { == key) { return return false false; ; } } else else { { Node Node node node = = new new Node(item); Node(item); node.next node.next = = new new AtomicMarkableRef AtomicMarkableRef(curr curr, , false false); ); if if ( (pred.next.compareAndSet pred.next.compareAndSet(curr curr, node, , node, false false, , false false)) { )) {return true return true;} ;} }}} }}}
When returning false
138
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
139
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
140
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
141
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
142
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
143
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
144
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
When returning true
145
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
146
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public Window find(Node head, Window find(Node head, int int key) { key) { Node Node pred pred = null, = null, curr curr = null, = null, succ succ = null; = null; boolean boolean[] [] marked = { marked = {false false}; }; boolean boolean snip; snip; retry: retry: while while ( (true true) { ) { pred pred = head; = head; curr curr = = pred.next.getReference pred.next.getReference(); (); while while ( (true true) { ) { succ succ = = curr.next.get curr.next.get(marked); (marked); while while (marked[0]) { (marked[0]) { … … } }
if ( if (curr.key curr.key >= key) >= key) return new Window( return new Window(pred pred, , curr curr); ); pred pred = = curr curr; ; curr curr = = succ succ; ; } }
}} }}
147
public public Window find(Node head, Window find(Node head, int int key) { key) { Node Node pred pred = null, = null, curr curr = null, = null, succ succ = null; = null; boolean boolean[] [] marked = { marked = {false false}; }; boolean boolean snip; snip; retry: while (true) { retry: while (true) { pred pred = head; = head; curr curr = = pred.next.getReference pred.next.getReference(); (); while (true) { while (true) { succ succ = = curr.next.get curr.next.get(marked); (marked); while (marked[0]) { while (marked[0]) { … … } }
if ( if (curr.key curr.key >= key) >= key) return new Window( return new Window(pred pred, , curr curr); ); pred pred = = curr curr; ; curr curr = = succ succ; ; } }
}} }}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
148
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public Window find(Node head, int key) { public Window find(Node head, int key) { Node pred = null, curr = null, succ = null; Node pred = null, curr = null, succ = null; boolean[] marked = {false}; boolean snip; boolean[] marked = {false}; boolean snip; retry: retry: while while ( (true true) { ) { pred = head; pred = head; curr = pred.next.getReference(); curr = pred.next.getReference(); while (true) { while (true) { succ = curr.next.get(marked); succ = curr.next.get(marked); while (marked[0]) { while (marked[0]) { … … } }
if (curr.key >= key) if (curr.key >= key) return new Window(pred, curr); return new Window(pred, curr); pred = curr; pred = curr; curr = succ; curr = succ; } }
}} }}
149
public Window find(Node head, public Window find(Node head, int int key) { key) { Node Node pred pred = null, = null, curr curr = null, = null, succ succ = null; = null; boolean boolean[] marked = {false}; [] marked = {false}; boolean boolean snip; snip; retry: while (true) { retry: while (true) { pred pred = head; = head; curr curr = = pred.next.getReference pred.next.getReference(); (); while (true) { while (true) { succ succ = = curr.next.get curr.next.get(marked); (marked); while (marked[0]) { while (marked[0]) { … … } }
if ( if (curr.key curr.key >= key) >= key) return new Window( return new Window(pred pred, , curr curr); ); pred pred = = curr curr; ; curr curr = = succ succ; ; } }
}} }}
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
150
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public Window find(Node head, public Window find(Node head, int int key) { key) { Node Node pred pred = null, = null, curr curr = null, = null, succ succ = null; = null; boolean boolean[] marked = {false}; [] marked = {false}; boolean boolean snip; snip; retry: while (true) { retry: while (true) { pred pred = head; = head; curr curr = = pred.next.getReference pred.next.getReference(); (); while while ( (true true) { ) { succ succ = = curr.next.get curr.next.get(marked); (marked); while while (marked[0]) { (marked[0]) { … … } }
if if ( (curr.key curr.key >= key) >= key) return return new Window( new Window(pred pred, , curr curr); ); pred pred = = curr curr; ; curr curr = = succ succ; ; } }
}} }}
151
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public Window find(Node head, public Window find(Node head, int int key) { key) { Node Node pred pred = null, = null, curr curr = null, = null, succ succ = null; = null; boolean boolean[] marked = {false}; [] marked = {false}; boolean boolean snip; snip; retry: while (true) { retry: while (true) { pred pred = head; = head; curr curr = = pred.next.getReference pred.next.getReference(); (); while (true) { while (true) { succ succ = = curr.next.get curr.next.get(marked); (marked); while (marked[0]) { while (marked[0]) { … … } }
if ( if (curr.key curr.key >= key) >= key) return new Window( return new Window(pred pred, , curr curr); ); pred pred = = curr curr; ; curr curr = = succ succ; ; } }
}} }}
152
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public Window find(Node head, int key) { public Window find(Node head, int key) { Node pred = null, curr = null, succ = null; Node pred = null, curr = null, succ = null; boolean[] marked = {false}; boolean snip; boolean[] marked = {false}; boolean snip; retry: while (true) { retry: while (true) { pred = head; pred = head; curr = pred.next.getReference(); curr = pred.next.getReference(); while (true) { while (true) { succ = curr.next.get(marked); succ = curr.next.get(marked); while while (marked[0]) { (marked[0]) { … … } }
if (curr.key >= key) if (curr.key >= key) return new Window(pred, curr); return new Window(pred, curr); pred = curr; pred = curr; curr = succ; curr = succ; } }
}} }}
153
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public Window find(Node head, public Window find(Node head, int int key) { key) { Node Node pred pred = null, = null, curr curr = null, = null, succ succ = null; = null; boolean boolean[] marked = {false}; [] marked = {false}; boolean boolean snip; snip; retry: while (true) { retry: while (true) { pred pred = head; = head; curr curr = = pred.next.getReference pred.next.getReference(); (); while (true) { while (true) { succ succ = = curr.next.get curr.next.get(marked); (marked); while (marked[0]) { while (marked[0]) { … … } }
if if ( (curr.key curr.key >= key) >= key) return return new Window( new Window(pred pred, , curr curr); ); pred pred = = curr curr; ; curr curr = = succ succ; ; } }
}} }}
154
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public Window find(Node head, int key) { public Window find(Node head, int key) { Node pred = null, curr = null, succ = null; Node pred = null, curr = null, succ = null; boolean[] marked = {false}; boolean snip; boolean[] marked = {false}; boolean snip; retry: while (true) { retry: while (true) { pred = head; pred = head; curr = pred.next.getReference(); curr = pred.next.getReference(); while (true) { while (true) { succ = curr.next.get(marked); succ = curr.next.get(marked); while (marked[0]) { while (marked[0]) { … … } }
if (curr.key >= key) if (curr.key >= key) return new Window(pred, curr); return new Window(pred, curr); pred = curr; pred = curr; curr = succ; curr = succ; } }
}} }}
155
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
retry: retry: while while ( (true true) { ) { … … while while (marked[0]) { (marked[0]) { snip = snip = pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, , false false, , false false); ); if if (!snip) (!snip) continue continue retry; retry; curr curr = = succ succ; ; succ succ = = curr.next.get curr.next.get(marked); (marked); } } … …
156
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
retry: while (true) { retry: while (true) { … … while while (marked[0]) { (marked[0]) { snip = snip = pred.next.compareAndSet pred.next.compareAndSet(curr curr, , succ succ, false, false); , false, false); if (!snip) continue retry; if (!snip) continue retry; curr curr = = succ succ; ; succ succ = = curr.next.get curr.next.get(marked); (marked); } } … …
157
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
retry: while (true) { retry: while (true) { … … while (marked[0]) { while (marked[0]) { snip = pred.next.compareAndSet(curr, snip = pred.next.compareAndSet(curr, succ, succ, false false, , false false); ); if (!snip) continue retry; if (!snip) continue retry; curr = succ; curr = succ; succ = curr.next.get(marked); succ = curr.next.get(marked); } } … …
158
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
retry: while (true) { retry: while (true) { … … while (marked[0]) { while (marked[0]) { snip = pred.next.compareAndSet(curr, snip = pred.next.compareAndSet(curr, succ, false, false); succ, false, false); if if (!snip) (!snip) continue continue retry; retry; curr = succ; curr = succ; succ = curr.next.get(marked); succ = curr.next.get(marked); } } … …
159
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
retry: while (true) { retry: while (true) { … … while (marked[0]) { while (marked[0]) { snip = pred.next.compareAndSet(curr, snip = pred.next.compareAndSet(curr, succ, false, false); succ, false, false); if (!snip) continue retry; if (!snip) continue retry; curr = succ; curr = succ; succ = curr.next.get(marked); succ = curr.next.get(marked); } } … …
160
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public Window find(Node head, Window find(Node head, int int key) { key) { Node Node pred pred = null, = null, curr curr = null, = null, succ succ = null; = null; boolean boolean[] [] marked = { marked = {false false}; }; boolean boolean snip; snip; retry: retry: while while ( (true true) { ) { pred pred = head; = head; curr curr = = pred.next.getReference pred.next.getReference(); (); while while ( (true true) { ) { succ succ = = curr.next.get curr.next.get(marked); (marked); while while (marked[0]) { (marked[0]) { … … } }
if ( if (curr.key curr.key >= key) >= key) return new Window( return new Window(pred pred, , curr curr); ); pred pred = = curr curr; ; curr curr = = succ succ; ; } }
}} }}
161
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
public public Window find(Node head, Window find(Node head, int int key) { key) { Node Node pred pred = null, = null, curr curr = null, = null, succ succ = null; = null; boolean boolean[] [] marked = { marked = {false false}; }; boolean boolean snip; snip; retry: retry: while while ( (true true) { ) { pred pred = head; = head; curr curr = = pred.next.getReference pred.next.getReference(); (); while while ( (true true) { ) { succ succ = = curr.next.get curr.next.get(marked); (marked); while while (marked[0]) { (marked[0]) { … … } }
if ( if (curr.key curr.key >= key) >= key) return new Window( return new Window(pred pred, , curr curr); ); pred pred = = curr curr; ; curr curr = = succ succ; ; } }
}} }}
Last read of non-marked node
162
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
n Preliminaries n A simple lock-free stack algorithm
n Michael & Sco] queue algorithm n The Harris-Michael linked list algorithm n EliminaGon-based stack n Discussion & conclusions
163
val next val next
val next
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 164
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
val next val next
val next
165
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
val next val next
val next
166
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Collision array
push pop push push Top
val next val next
val next
Central stack
pop push
167
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Each stack operation is represented by a ThreadInfo structure struct ThreadInfo { id ;the identifier of the thread performing the operation
cell ;a cell structure spin ; duration to spin } Struct cell { ;a representation of stack item as in Treiber pnext ;pointer to the next cell pdata ;stack item}
p1 p2 p3 pn
Thread Info Thread Info
p4
p1 p7
168
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
void EStack(ThreadInfo *p) 1. Do forever 2. stack: if (TryPerformStackOp(p)==TRUE) return ;Aapply op to central stack 3. location[mypid]=p ;announce arrival 4. pos=GetPosition(p) ;get a random position at the collision array 5. him=collision[pos] ;read current value of that position 6. while (!compare&swap(&collision[pos],him,mypid);try to write own ID 7. him=collision[pos] ;continue till success 8. if (him != empty) ;if read an ID of another thread 9. q=location[him] ;read a pointer to the other thread’s info 10. if (q!=NULL && q->id=him && q->op != p->op) ;if may collide 11. if (compare&swap(&location[mypid],p,NULL) ; prevent unwanted collisions 12. if (TryCollision(p,q)==true) ;if collided successfully 13. return ;return code is already at ThreadInfo structure 14. else goto stack ;try to apply operation to central stack 15. else FinishCollision(p), return ;extract information and finish 16. delay (p->spin) ;Wait for other thread to collide with me 17. if (!compare&swap(&location[mypid],p,NULL) ;if someone collided with me 18. FinishCollision(p), return;Extract information and finish
169
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
void TryCollision(ThreadInfo* p, ThreadInfo *q) 1. if (p->op==PUSH) 2. if (compare&swap(&location[him],q,p)) ;give my record to other thread 3. return TRUE 4. else 5. return FALSE 6. else 7. if (compare&swap(&location[him],q,NULL)) 8. p->cell=q->cell ;get pointer to PUSH operation’s cell 9. return TRUE 10. else 11. return FALSE void FinishCollision(ThreadInfo* p) 1. if (p->op==POP) 2. p->pcell=location[mypid]->pcell 3. location[mypid]=NULL
170
void TryCollision(ThreadInfo* p, ThreadInfo *q) 1. if (p->op==PUSH) 2. if (compare&swap(&location[him],q,p)) ;give my record to other thread 3. return TRUE 4. else 5. return FALSE 6. else 7. if (compare&swap(&location[him],q,NULL)) 8. p->cell=q->cell ;get pointer to PUSH operation’s cell 9. return TRUE 10. else 11. return FALSE
Upon success Upon success
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 171
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
172
n Preliminaries n A simple lock-free stack algorithm
n Michael & Sco] queue algorithm n The Harris-Michael linked list algorithm n EliminaGon-based stack n Discussion & conclusions
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 173
Censor-Hillel, Petrank and Timnat, PODC, 2015 Attiya, Castañeda and Hendler , OPODIS, 2015
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 174
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 175
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 176
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
177
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
atomically
t read from c c c + 1 return t
atomically
t read from var var new return t
179
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 180
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017
181
Danny Hendler, SPTCC summer school, Saint-Petersburg, 2017 182