This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fc62da1d8b4a4e242a5aa70b1a0469634fb02faf
[perl5.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 my $test : shared = 1;
22
23 sub reader {
24     my $tid = threads->self->tid;
25     my $i = 0;
26     while (1) {
27         $i++;
28 #       print "reader (tid $tid): waiting for element $i...\n";
29         my $el = $q->dequeue;
30         print "ok $test\n"; $test++;
31 #       print "reader (tid $tid): dequeued element $i: value $el\n";
32         select(undef, undef, undef, rand(1));
33         if ($el == -1) {
34             # end marker
35 #           print "reader (tid $tid) returning\n";
36             return;
37         }
38     }
39 }
40
41 my $nthreads = 5;
42 my @threads;
43
44 for (my $i = 0; $i < $nthreads; $i++) {
45     push @threads, threads->new(\&reader, $i);
46 }
47
48 for (my $i = 1; $i <= 20; $i++) {
49     my $el = int(rand(100));
50     select(undef, undef, undef, rand(1));
51 #    print "writer: enqueuing value $el\n";
52     $q->enqueue($el);
53 }
54
55 $q->enqueue((-1) x $nthreads); # one end marker for each thread
56
57 for(@threads) {
58 #       print "waiting for join\n";
59         $_->join();
60 }
61 print "ok $test\n";
62
63