tomo/test/threads.tm

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!