blob: adf7784a495c1c3dd6f40f6cf61cbac33220b3de (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
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!
|