#! perl -slw use strict; use Data::Dump qw[ pp ]; use Time::HiRes qw[ time ]; use List::Util qw[ shuffle ]; use threads; use threads::shared; our $START //= 'aaa'; our $END //= 'zzz'; my %hash :shared = map{ my $n :shared = 0; $_ => \$n } $START .. $END; my $start = time; $_->join for map{ async{ my @order; { lock %hash; @order = shuffle keys %hash; } for ( @order ) { lock ${ $hash{ $_ } }; ++${ $hash{ $_ } }; } } } 1 .. 40; printf "Lock scalar ref took %.3f seconds\n", time() - $start; my @fails = grep $$_ != 40, values %hash; warn @fails . " fails\n" if @fails; __END__ C:\test>909437-2 Lock scalar ref took 42.807 seconds