Metered concurrency: Difference between revisions

m
No edit summary
Line 761:
Icon doesn't support concurrency. A Unicon solution is:
<lang unicon>procedure main(A)
n := integer(A[1] | 3) # Max. number of active tasks
write("^C to terminate")
nm := integer(A[12] | 32) # Number of visits by each task
k := integer(A[3] | 5) # Number of tasks
sem := [: |mutex([])\n :]
every put(threads := [], (i := 1 to 10 dok, thread
repeatevery 1 to m do {
write("unit ",i," ready")
until flag := trylock(!sem)
Line 772 ⟶ 773:
write("unit ",i," done")
unlock(flag)
}))
 
readevery wait(!threads)
end</lang>
 
Line 780 ⟶ 781:
<pre>
->mc
^C to terminate
unit 2 ready
unit 2 running
unit 1 ready
unit 1 running
unit 3 ready
unit 3 running
unit 6 ready
unit 6 running
unit 5 ready
unit 1 ready
unit 4 ready
unit 105 ready
unit 9 ready
unit 7 ready
unit 8 ready
unit 2 done
unit 1 running
unit 2 ready
unit 3 done
unit 5 running
unit 3 ready
unit 6 done
unit 6 ready
unit 2 running
unit 1 done
unit 72 running
unit 1 ready
unit 53 done
unit 93 ready
unit 4 running
unit 85 readydone
unit 5 ready
unit 21 running
unit 2 done
unit 25 readyrunning
unit 34 readydone
unit 3 running
unit 74 ready
^C
unit 61 done
unit 64 running
unit 65 readydone
unit 3 done
unit 64 readydone
->
</pre>