| Given | a single thread does |
| i = 0 if i > |a|, break if a[i] ≡ x, return i i = i + 1 if i > |a|, break if a[i] ≡ x, return i i = i + 1 if i > |a|, break if a[i] ≡ x, return i i = i + 1 if i > |a|, break |
| \(\vdots\) |
Given find(), two threads do | |
| t1 | t2 |
i = 0 if i > |a|, break if a[i] ≡ x, return i i = i + 1 if i > |a|, break if a[i] ≡ x, return i i = i + 1 if i > |a|, break if a[i] ≡ x, return i i = i + 1 if i > |a|, break if a[i] ≡ x, return i | i = 0 if i > |a|, break if a[i] ≡ x, return i i = i + 1 if i > |a|, break if a[i] ≡ x, return i i = i + 1 if i > |a|, break if a[i] ≡ x, return i |
| \(\vdots\) | \(\vdots\) |
Given find() and one execution engine, threads
t1 and t2 do | |
i = 0 if i > |a|, break if a[i] ≡ x, return i i = 0 if i > |a|, break i = i + 1 if i > |a|, break if a[i] ≡ x, return i i = i + 1 if i > |a|, break if a[i] ≡ x, return i i = i + 1 if a[i] ≡ x, return i | |
| \(\vdots\) | |


widget q[N] q-size = 0 head = tail = 0
and the two functions
|
|
p() and c() in separate threads.

p() | c() |
w = f() q-size ≡ N q[tail++] = w ++q-size w = f() q-size ≡ N q[tail++] = w ++q-size w = f() q-size ≡ N q[tail++] = w ++q-size w = f() q-size ≡ N | q-size ≡ 0 w = q[head++] --q-size g(w) q-size ≡ 0 w = q[head++] --q-size g(w) q-size ≡ 0 w = q[head++] --q-size |
| \(\vdots\) | \(\vdots\) |
find(), concurrency causes problems for p() and c().
head and tail are shared, but not really.
p() uses tail; only c() uses head.
p() and c() use q, but not without conflicts.
q-size.
++ and -- implemented?
--q-size:++q-size: get ri, @q-size sub ri, 1 put ri, @q-size get ri, @q-size add ri, 1 put ri, @q-size
p() | c() |
get ri, @q-size add ri, 1 put ri, @q-size get ri, @q-size add ri, 1 put ri, @q-size get ri, @q-size add ri, 1 put ri, @q-size | get ri, @q-size sub ri, 1 put ri, @q-size get ri, @q-size sub ri, 1 put ri, @q-size get ri, @q-size sub ri, 1 |
| \(\vdots\) | \(\vdots\) |
get ri, @q-size get ri, @q-size sub ri, 1 put ri, @q-size add ri, 1 put ri, @q-size get ri, @q-size sub ri, 1 get ri, @q-size add ri, 1 put ri, @q-size put ri, @q-size |
p() and c() execute in multiplexed concurrency.
p() and c() interfere with each other when setting
q-size’s value.
|
| \(\vdots\) |
| This page last modified on 2014 September 30. |