plain text version:threads.csp
1| package threads;
2| //|
3| //| test of 11 threads running simultaneously
4| //| 10 of them will cause garbage collection at one time
5| //| and one will run constantly, even during garbage collection
6| //|
7|
8| var all = new array();
9| var all_guard = new mutex();
10|
11| // will cause garbage collection due to string allocations
12| function thread_func(sign) {
13| var i, x = "";
14| for (i = 0; i < 1000; ++i)
15| {
16| // will be suspended here during gc cycle
17| // somewhere in the next statement
18| x += " hello " + " goodbye ";
19| // will be awakened after gc cycle
20| print(sign);
21| }
22| print("*****");
23| synchronized(all_guard)
24| {
25| all[sign] = new thread(thread_func,sign);
26| }
27| }
28|
29| // will not cause garbage collection. nothing allocating
30| // will be active even during gc cycle
31| function nongc_thread_func() {
32| var i,x = 0;
33| for (i = 0; i < 1000; ++i)
34| {
35| x = x + 1;
36| print("_");
37| }
38| print("/////");
39| new thread(nongc_thread_func);
40| }
41|
42| function main()
43| {
44| var i;
45| for (i = 0; i < 10; ++i) all.push(new thread(thread_func,i));
46| new thread(nongc_thread_func);
47| var w;
48| do
49| {
50| w = 0;
51| synchronized(all_guard)
52| {
53| for (i = 0; i < all.length; ++i)
54| {
55| if(all[i].running) w = 1;
56| }
57| }
58| print("-");
59| } while(w);
60| }
61|