aboutsummaryrefslogtreecommitdiff
path: root/test/threads.tm
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!