my $count = 100_000; my $num_calls = 4; my $sum = 0; sub inc { ++$sum for 1..$count; } inc() for 1..$num_calls; print("$sum\n"); # 400000 #### use threads; use threads::shared; my $count = 100_000; my $num_calls = 4; my $sum : shared = 0; sub inc { ++$sum for 1..$count; } $_->join for map { threads->create( \&inc ) } 1..$num_calls; print("$sum\n"); # 314813 #### +=======================+ | CPU | +-----------+-----------+ | thread 1 | thread 2 | +===========+===========+ | ... | | T | load $sum | | i | inc | | m +-----------+-----------+ e | | ... | | | | load $sum | | | | inc | v | | save $sum | | | ... | +-----------+-----------+ | save $sum | | | ... | | +===========+===========+ #### use threads; use threads::shared; my $count = 100_000; my $num_calls = 4; my $sum : shared = 0; sub inc { for (1..$count) { lock($sum); ++$sum } } $_->join for map { threads->create( \&inc ) } 1..$num_calls; print("$sum\n"); # 400000 #### ++s sum = 233564 (expecting 400000) s+=1 sum = 143915 (expecting 400000) c.=l length = 248149 (expecting 400000) c=c.l length = 123360 (expecting 400000) #### use v5.8.0; use strict; use warnings; use threads; use threads::shared; { my $count = 100_000; my $threads = 4; my $sum : shared = 0; sub inc { for (1..$count) { ++$sum; } } $_->join for map { threads->create( \&inc ) } 0..$threads-1; print("++s sum = $sum (expecting " . ($count*$threads). ")\n"); } { my $count = 100_000; my $threads = 4; my $sum : shared = 0; sub inc_assign { for (1..$count) { $sum += 1; } } $_->join for map { threads->create( \&inc_assign ) } 0..$threads-1; print("s+=1 sum = $sum (expecting " . ($count*$threads). ")\n"); } { my $count = 100_000; my $threads = 4; my $content : shared = ''; sub append { my ($letter) = @_; for (1..$count) { $content .= $letter; } } $_->join for map { threads->create( \&append, chr(ord('a')+$_) ) } 0..$threads-1; print("c.=l length = " . length($content) . " (expecting " . ($count*$threads). ")\n"); } { my $count = 100_000; my $threads = 4; my $content : shared = ''; sub concatenate { my ($letter) = @_; for (1..$count) { $content = $content . $letter; } } $_->join for map { threads->create( \&concatenate, chr(ord('a')+$_) ) } 0..$threads-1; print("c=c.l length = " . length($content) . " (expecting " . ($count*$threads). ")\n"); }