in reply to Re^6: Threads sharing global variable
in thread Threads sharing global variable
This is your most disingenuous post to date. (The latest in a very long line.)
Below is a simple experiment using your exact posted code from Re^2: Threads sharing global variable; that anyone running windows and a few versions of perl installed, can conduct for themselves in around five minutes, and see your dishonesty for themselves.
This is your code running under This is perl, v5.10.1 built for MSWin32-x64-multi-thread:
C:\test>type 1156698.pl use threads; use threads::shared; use Thread::Queue; my $a :shared = 0; my $q = Thread::Queue->new(); sub set_positive { lock $a; while (1) { cond_wait($a) while $a > 0; $a = int(rand() * 100) + 1; cond_signal($a); $q->enqueue($a); } } sub set_zero { lock $a; while (1) { cond_wait($a) while $a == 0; $a = 0; cond_signal($a); $q->enqueue($a); } } sub printer { while (1) { my ($v_a, $v_b) = $q->dequeue(2); print "At printer $v_a $v_b\n"; } } threads->create($_) for qw( set_positive $_->join for threads->list; C:\test>1156698 At printer 6 0 At printer 76 0 At printer 24 0 At printer 77 0 At printer 60 0 At printer 20 0 At printer 62 0 At printer 77 0 At printer 39 0 At printer 1 0 At printer 25 0 At printer 7 0 At printer 3 0 At printer 28 0 At printer 64 0 At printer 11 0 At printer 74 0 At printer 18 0 At printer 22 0 At printer 40 0 At printer 17 0 At printer 75 0 At printer 48 0 At printer 14 0 At printer 21 0 At printer 48 0 At printer 84 0 At printer 80 0 At printer 72 0 At printer 40 0 At printer 13 0 At printer 78 0 At printer 31 0 At printer 65 0 At printer 32 0 At printer 37 0 At printer 12 0 At printer 43 0 At printer 48 0 At printer 93 0 At printer 77 0 At printer 24 0 At printer 53 0 At printer 82 0 At printer 27 0 At printer 29 0 At printer 80 0 At printer 89 0 At printer 17 0 At printer 2 0 At printer 88 0 At printer 93 0 At printer 86 0 At printer 62 0 At printer 91 0 At printer 3 0 At printer 3 0 At printer 47 0 At printer 70 0 At printer 27 0 At printer 38 0 At printer 35 0 At printer 87 0 At printer 54 0 At printer 62 0 At printer 45 0 At printer 35 0 At printer 2 0 At printer 69 0 At printer 90 0 At printer 44 0 At printer 21 0 At printer 39 0 At printer 96 0 At printer 89 0 At printer 82 0 At printer 26 0 At printer 50 0 At printer 2 0 At printer 52 0 At printer 97 0 At printer 2 0 At printer 41 0 At printer 91 0 At printer 99 0 At printer 67 0 At printer 28 0 At printer 67 0 At printer 85 0 At printer 72 0 At printer 94 0 At printer 23 0 At printer 73 0 At printer 79 0 At printer 47 0 At printer 89 0 At printer 68 0 At printer 34 0 At printer 7 0 At printer 79 0 At printer 32 0 At printer 80 0 At printer 23 0 At printer 73 0 At printer 15 0 At printer 64 0 At printer 10 0 At printer 4 0 At printer 37 0 At printer 4 0 At printer 16 0 At printer 62 0 At printer 52 0 At printer 23 0 At printer 85 0 At printer 44 0 At printer 55 0 At printer 22 0 At printer 89 0 At printer 43 0 At printer 82 0 At printer 9 0 At printer 15 0 At printer 15 0 At printer 61 0 At printer 47 0 At printer 87 0 At printer 22 0 At printer 60 0 At printer 27 0 At printer 86 0 At printer 81 0 At printer 96 0 At printer 58 0 At printer 72 0 At printer 14 0 At printer 38 0 At printer 57 0 At printer 56 0 At printer 47 0 At printer 89 0 At printer 31 0 At printer 28 0 At printer 35 0 At printer 62 0 At printer 50 0 At printer 92 0 At printer 65 0 At printer 41 0 At printer 85 0 At printer 19 0 At printer 21 0 At printer 44 0 At printer 28 0 At printer 58 0 At printer 53 0 At printer 75 0 At printer 43 0 At printer 18 0 At printer 45 0 At printer 88 0 At printer 98 0 At printer 74 0 At printer 19 0 At printer 43 0 At printer 98 0 At printer 93 0 At printer 59 0 At printer 82 0 At printer 80 0 At printer 37 0 At printer 12 0 At printer 100 0 At printer 99 0 At printer 55 0 At printer 38 0 At printer 49 0 At printer 46 0 At printer 99 0 At printer 69 0 At printer 37 0 At printer 47 0 At printer 79 0 At printer 45 0 At printer 66 0 At printer 71 0 At printer 13 0 At printer 90 0 At printer 80 0 At printer 2 0 At printer 69 0 At printer 3 0 At printer 43 0 At printer 98 0 At printer 43 0 At printer 12 0 At printer 49 0 At printer 3 0 At printer 3 0 At printer 80 0 At printer 60 0 At printer 18 0 At printer 25 0 At printer 4 0 At printer 80 0 At printer 6 0 At printer 33 0 At printer 93 0 At printer 73 0 At printer 52 0 At printer 7 0 At printer 74 0 At printer 11 0 At printer 22 0 At printer 43 0 At printer 13 0 At printer 82 0 At printer 62 0 At printer 37 0 At printer 84 0 At printer 29 0 At printer 82 0 At printer 80 0 At printer 92 0 At printer 56 0 At printer 59 0 At printer 26 0 At printer 79 0 At printer 77 0 At printer 4 0 At printer 38 0 At printer 1 0 At printer 26 0 At printer 31 0 At printer 59 0 At printer 33 0 At printer 29 0 At printer 76 0 At printer 11 0 At printer 74 0 At printer 37 0 At printer 87 0 At printer 84 0 At printer 3 0 At printer 25 0 At printer 56 0 At printer 4 0 At printer 74 0 At printer 66 0 At printer 2 0 At printer 51 0 At printer 94 0 At printer 69 0 At printer 74 0 At printer 10 0 At printer 65 0 At printer 100 0 At printer 87 0 At printer 24 0 At printer 43 0 At printer 83 0 At printer 58 0 At printer 46 0 At printer 97 0 At printer 76 0 At printer 62 0 At printer 44 0 At printer 9 0 At printer 37 0 At printer 63 0 At printer 56 0 At printer 8 0 At printer 83 0 At printer 49 0 At printer 63 0 At printer 78 0 At printer 29 0 At printer 21 0 At printer 70 0 At printer 32 0 At printer 34 0 At printer 71 0 At printer 43 0 At printer 83 0 At printer 34 0 At printer 95 0 At printer 33 0 Terminating on signal SIGINT(2)
Summary: It produces 287(*) lines of output before hanging. (Varies from run to run; but that's typical.)
This is your code running under This is perl 5, version 18, subversion 4 (v5.18.4) built for MSWin32-x64-multi-thread:
Summary: It produces 817* lines of output. (Usually runs a little longer than under 5.10, but of 20 runs this was the most output before hanging.)
This is your code running under This is perl 5, version 22, subversion 0 (v5.22.0) built for MSWin32-x64-multi-thread:
Summary: It produces 479* lines of output before hanging! (After 10 runs the average was around 700 lines, but that included one run that gave nearly 2000 lines and another that produced 17.)
I'm also now firmly convinced that it will hang everywhere -- even under Linux -- if left running long enough, because a signal will eventually be missed and it will deadlock. This is inevitable; but is an exercise for someone else to (dis)prove.
|
|---|