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");
}