Given | a single thread does |
int find(a[], x) for i = 1 to |a| if a[i] ≡ x return i return -1
| 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() loop w = f() while q-size ≡ N {} q[tail++] = w ++q-size
| c() loop while q-size ≡ 0 {} w = q[head++] --q-size g(w)
|
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. |