Fixed race condtions and deadlocks in interaction with
[p5sagit/p5-mst-13.2.git] / ext / threads / shared / t / queue.t
1
2
3 BEGIN {
4     chdir 't' if -d 't';
5     push @INC ,'../lib';
6     require Config; import Config;
7     unless ($Config{'useithreads'}) {
8         print "1..0 # Skip: might still hang\n";
9         exit 0;
10     }
11 }
12
13
14 use threads;
15 use threads::queue;
16
17 $q = new threads::shared::queue;
18
19 print "1..26\n";
20
21 sub reader {
22     my $tid = threads->self->tid;
23     my $i = 0;
24     while (1) {
25         $i++;
26 #       print "reader (tid $tid): waiting for element $i...\n";
27         my $el = $q->dequeue;
28         print "ok\n";
29 #       print "reader (tid $tid): dequeued element $i: value $el\n";
30         select(undef, undef, undef, rand(1));
31         if ($el == -1) {
32             # end marker
33 #           print "reader (tid $tid) returning\n";
34             return;
35         }
36     }
37 }
38
39 my $nthreads = 5;
40 my @threads;
41
42 for (my $i = 0; $i < $nthreads; $i++) {
43     push @threads, threads->new(\&reader, $i);
44 }
45
46 for (my $i = 1; $i <= 20; $i++) {
47     my $el = int(rand(100));
48     select(undef, undef, undef, rand(1));
49 #    print "writer: enqueuing value $el\n";
50     $q->enqueue($el);
51 }
52
53 $q->enqueue((-1) x $nthreads); # one end marker for each thread
54
55 for(@threads) {
56 #       print "waiting for join\n";
57         $_->join();
58 }
59 print "ok\n";
60
61