71 lines
1.5 KiB
Tcl
71 lines
1.5 KiB
Tcl
enum Job(Increment(x:Int), Decrement(x:Int))
|
|
|
|
func main():
|
|
do:
|
|
>> nums := mutexed [10, 20, 30]
|
|
holding nums:
|
|
>> nums[]
|
|
= [10, 20, 30]
|
|
nums:insert(40)
|
|
|
|
holding nums:
|
|
>> nums[]
|
|
= [10, 20, 30, 40]
|
|
|
|
|
|
jobs := mutexed [Job.Increment(5)]
|
|
|
|
results := mutexed [:Int]
|
|
|
|
>> thread := Thread.new(func():
|
|
!! In another thread!
|
|
repeat:
|
|
job := holding jobs: (jobs:pop(1) or stop)
|
|
when job is Increment(x):
|
|
holding results: results:insert(x + 1)
|
|
is Decrement(x):
|
|
holding results: results:insert(x - 1)
|
|
)
|
|
|
|
holding jobs:
|
|
jobs:insert(Decrement(100))
|
|
jobs:insert(Decrement(200))
|
|
jobs:insert(Decrement(300))
|
|
jobs:insert(Decrement(400))
|
|
jobs:insert(Decrement(500))
|
|
jobs:insert(Decrement(600))
|
|
jobs:insert(Increment(1000))
|
|
|
|
dequeue_result := func():
|
|
result := none:Int
|
|
repeat:
|
|
result = (holding results: results:pop(1))
|
|
stop if result
|
|
sleep(0.00001)
|
|
return result!
|
|
|
|
>> dequeue_result()
|
|
= 6
|
|
>> dequeue_result()
|
|
= 99
|
|
|
|
>> dequeue_result()
|
|
= 199
|
|
>> dequeue_result()
|
|
= 299
|
|
>> dequeue_result()
|
|
= 399
|
|
>> dequeue_result()
|
|
= 499
|
|
>> dequeue_result()
|
|
= 599
|
|
|
|
>> dequeue_result()
|
|
= 1001
|
|
|
|
!! Canceling...
|
|
>> thread:cancel()
|
|
!! Joining...
|
|
>> thread:join()
|
|
!! Done!
|