| 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:
| 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()andc()execute in multiplexed concurrency.p()andc()interfere with each other when settingq-size’s value. | 
| \(\vdots\) | 
| This page last modified on 2014 September 30. |