threads.pm: WC: 13.76s Usr: 0.39s Sys: 0.07s CSv/f: 0/0 IOops: 0/0 Sigs: 0 Swaps: 0 PF: 2500/1265 Msg: 0/0 Mem: 65499 forks.pm: WC: 18.30s Usr: 0.33s Sys: 0.22s CSv/f: 0/0 IOops: 0/0 Sigs: 0 Swaps: 0 PF: 14427/2524 Msg: 0/0 Mem: 5454 #### # which threading model do we want? use threads; use threads::shared; #use forks; use forks::shared; $num_threads = shift(@ARGV) || 10; $nonshared_var = 1; my $shared_var : shared = 1; foreach (0..$num_threads-1) { # create a new thread push(@threads,threads->new(\&thread_sub)); } foreach $thread (@threads) { # wait for threads to finish $thread->join(); } printf "Orig thread done\n"; sub thread_sub { my($count) = 20*rand() + 1; my($random); printf "Thread %d started\n",threads->tid(); # do some stuff while ($count-- > 0) { $random = (5*rand()) | (time() & 0x3); $nonshared_var += int($random); lock($shared_var); $shared_var += int($random); sleep($random); printf(" Thread %d loop %d: random=%d, nonshared_var=%d, ". "shared_var=%d\n",threads->tid(),$count,$random,$nonshared_var, $shared_var); threads->yield(); } printf("Thread %d DONE!\n",threads->tid()); }