29 lines
636 B
Haskell
29 lines
636 B
Haskell
global nWorkers, workers, cv
|
|
|
|
procedure main(A)
|
|
nWorkers := integer(A[1]) | 3
|
|
cv := condvar()
|
|
every put(workers := [], worker(!nWorkers))
|
|
every wait(!workers)
|
|
end
|
|
|
|
procedure worker(n)
|
|
return thread every !3 do { # Union limits each worker to 3 pieces
|
|
write(n," is working")
|
|
delay(?3 * 1000)
|
|
write(n," is done")
|
|
countdown()
|
|
}
|
|
end
|
|
|
|
procedure countdown()
|
|
critical cv: {
|
|
if (nWorkers -:= 1) <= 0 then {
|
|
write("\t\tAll done")
|
|
nWorkers := *workers
|
|
return (unlock(cv),signal(cv, 0))
|
|
}
|
|
wait(cv)
|
|
}
|
|
end
|