【发布时间】:2017-05-04 20:00:22
【问题描述】:
我开始学习并行编程,我想比较一下单线程程序和多线程程序。
我需要做一个非常简单的算法,它可以在一分钟内计算出可能的质数的最大数量,并显示最后计算的质数及其在质数中的位置。
例如,素数 23,将显示为数字 23 及其位置 9,因为它是第 9 个素数。
在不使用线程的情况下,找到的素数为 233,596,最后一个素数为 3,246,107。但是通过线程,找到了 229,972 个素数,最后一个素数是 3,192,463。
我认为这是错误的,因为多线程应该比单线程获得更好的结果。我相信这是一个非常基本的错误,但我无法解决它,因为我仍然不太了解 Perl 的并行性。
这是代码。它计算一分钟单线程的素数,然后使用共享变量对四个线程进行相同的计算。
use threads;
use threads::shared;
my $seconds = 60;
# WITHOUT THREAD #
print "\n\n Calc without Threads:\n";
my $endTime = time() + $seconds;
calcWithoutThread();
print "\n\n ----------------===========================---------------- \n";
# WITH THREAD #
print "\n\n Calc with Threads:\n";
my $prime :shared = 5; # Starts from the 5th prime
my $totalPrime :shared = 2; # Starts with prime 2 and prime 3
my $lastPrime :shared = 0;
my $endTime1 = time() + $seconds;
my $thread1 = threads->create(\&calcWithThread);
my $thread2 = threads->create(\&calcWithThread);
my $thread3 = threads->create(\&calcWithThread);
my $thread4 = threads->create(\&calcWithThread);
$thread1->join();
$thread2->join();
$thread3->join();
$thread4->join();
print " Was found $totalPrime prime numbers. Last prime: $lastPrime.";
# SUB's #
sub calcWithoutThread{
$prime = 5; # Starts from the 5th prime
$totalPrime = 2; # Starts with prime 2 and prime 3
$lastPrime = 0;
while (time() < $endTime){
if(calcPrime($prime)){
$totalPrime ++;
$lastPrime = $prime;
}
$prime ++;
}
print " Was found $totalPrime prime numbers. Last prime: $lastPrime.";
}
sub calcWithThread{
while (time() < $endTime1) {
lock($prime);
if(calcPrime($prime)){
$totalPrime ++;
$lastPrime = $prime;
}
$prime ++;
}
}
sub calcPrime{
for($i=2 ; $i< sqrt ($prime) ; $i++){
if( $prime % $i == 0){
return 0;
}
}
return 1;
}
逻辑是线程同步进行此计算,无论是否为质数,并且在计算时也不重叠值。
【问题讨论】:
标签: multithreading perl