Commit | Line | Data |
---|---|---|
6d1f61ba | 1 | |
2 | ||
3 | BEGIN { | |
89661126 | 4 | chdir 't' if -d 't'; |
5 | push @INC ,'../lib'; | |
6 | require Config; import Config; | |
7 | unless ($Config{'useithreads'}) { | |
6d1f61ba | 8 | print "1..0 # Skip: might still hang\n"; |
9 | exit 0; | |
89661126 | 10 | } |
6d1f61ba | 11 | } |
12 | ||
13 | ||
14 | use threads; | |
15 | use threads::queue; | |
16 | ||
17 | $q = new threads::shared::queue; | |
18 | ||
89661126 | 19 | print "1..26\n"; |
20 | ||
974236b4 | 21 | my $test : share = 1; |
22 | ||
6d1f61ba | 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; | |
974236b4 | 30 | print "ok $test\n"; $test++; |
6d1f61ba | 31 | # print "reader (tid $tid): dequeued element $i: value $el\n"; |
89661126 | 32 | select(undef, undef, undef, rand(1)); |
6d1f61ba | 33 | if ($el == -1) { |
34 | # end marker | |
35 | # print "reader (tid $tid) returning\n"; | |
36 | return; | |
37 | } | |
38 | } | |
39 | } | |
40 | ||
89661126 | 41 | my $nthreads = 5; |
6d1f61ba | 42 | my @threads; |
43 | ||
44 | for (my $i = 0; $i < $nthreads; $i++) { | |
45 | push @threads, threads->new(\&reader, $i); | |
46 | } | |
47 | ||
89661126 | 48 | for (my $i = 1; $i <= 20; $i++) { |
6d1f61ba | 49 | my $el = int(rand(100)); |
89661126 | 50 | select(undef, undef, undef, rand(1)); |
6d1f61ba | 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) { | |
89661126 | 58 | # print "waiting for join\n"; |
6d1f61ba | 59 | $_->join(); |
6d1f61ba | 60 | } |
974236b4 | 61 | print "ok $test\n"; |
6d1f61ba | 62 | |
63 |