tomo/test/threads.tm

71 lines
1.5 KiB
Plaintext
Raw Normal View History

2024-08-11 11:47:34 -07:00
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]
2024-08-18 20:31:36 -07:00
2024-08-11 11:47:34 -07:00
>> thread := Thread.new(func():
!! In another thread!
2024-11-03 09:20:53 -08:00
repeat:
job := holding jobs: (jobs:pop(1) or stop)
when job is Increment(x):
holding results: results:insert(x + 1)
2024-08-11 11:47:34 -07:00
is Decrement(x):
holding results: results:insert(x - 1)
2024-08-11 11:47:34 -07:00
)
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))
2024-08-11 11:47:34 -07:00
dequeue_result := func():
result := none:Int
repeat:
result = (holding results: results:pop(1))
stop if result
sleep(0.00001)
return result!
2024-08-11 11:47:34 -07:00
>> dequeue_result()
= 6
>> dequeue_result()
2024-08-11 11:47:34 -07:00
= 99
>> dequeue_result()
= 199
>> dequeue_result()
= 299
>> dequeue_result()
= 399
>> dequeue_result()
= 499
>> dequeue_result()
= 599
2024-08-11 12:04:22 -07:00
>> dequeue_result()
2024-08-11 11:47:34 -07:00
= 1001
!! Canceling...
2024-08-11 11:47:34 -07:00
>> thread:cancel()
!! Joining...
2024-08-11 11:47:34 -07:00
>> thread:join()
!! Done!