Hello

I am playing around with Semaphore, and wrote the following:

| coll count sem |
coll := Array withAll: (1 to: 100).
count := 0.
sem := Semaphore new.
coll do: [ :each |
    count := count + 1.
    (count >= 5)
        ifTrue: [
            Transcript show: 'waiting...'; cr.
            sem wait ].

    [ [ 2 seconds asDelay wait.
         Transcript show: each printString, ' ', count printString; cr ]
ensure: [
            count := count -1.
            sem signal ] ] fork ]

The output is:

waiting...
1  End of statement list encountered ->5
2 4
3 3
4 2
waiting...
waiting...
waiting...
waiting...
5 8
6 7
7 6
8 5
9 4
10 3
11 2
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
12 11
13 10
14 9
15 8
16 7
17 6
18 5
19 4
20 3
21 2
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
22 14
23 13
24 12
25 11
26 10
27 9
28 8
29 7
30 6
31 5
32 4
33 3
34 2
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
35 17
36 16
37 15
38 14
39 13
40 12
41 11
42 10
43 9
44 8
45 7
46 6
47 5
48 4
49 3
50 2
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
51 20
52 19
53 18
54 17
55 16
56 15
57 14
58 13
59 12
60 11
61 10
62 9
63 8
64 7
65 6
66 5
67 4
68 3
69 2
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
70 23
waiting...
71 23
72 22
73 21
74 20
75 19
76 18
77 17
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
waiting...
78 23
79 22
80 21
81 20
82 19
83 18
84 17
85 16
86 15
87 14
88 13
89 12
90 11
91 10
92 9
93 8
94 7
95 6
96 5
97 4
98 3
99 2
100 1

I was expecting 'waiting...' to alternate with the 'each-count' lines. Also
the entire statement paused for 2 seconds, spat out some lines, then waited
a little longer, and then finished.

Can someone please explain this pattern?

Thanks, Vince

Reply via email to