2011-06-03 159 views
5

我正在學習Perl的多線程。我的代碼:這爲什麼打印12次?

use warnings; 
use threads; 
use threads::shared; 

$howmany = 10; 
$threads = 5; 

$to = int($howmany/$threads); 

for (0 .. $threads) {$trl[$_] = threads->create(\&main, $_);} 
for (@trl) {$_->join;} 

sub main { 
    for (1 .. $to) { 
     print "test\n"; 
    } 
} 

exit(0); 

我想要打印的字測試$howmany$threads線程。 此代碼打印測試 12次。哪裏有問題?

回答

10

那麼我想你想for (0..$threads-1)for (1..$threads),不for (0..$threads)

:-)

+0

沒錯!我有幾個小時我無法理解這個問題。非常感謝你。 – Anton 2011-06-03 00:40:49

3
for(0..$threads) 

運行時間:0,1,2,3,4,5

11

我可以建議一種替代方法嗎?

use strict; 
use warnings; 

use threads  ;#qw(async); 
use Thread::Queue qw(); 

my $num_workers = 5; 
my $num_work_units = 10; 

my $q = Thread::Queue->new(); 

# Create workers 
my @workers; 
for (1..$num_workers) { 
    push @workers, async { 
     while (defined(my $unit = $q->dequeue())) { 
     print("$unit\n"); 
     } 
    }; 
} 

# Create work 
for (1..$num_work_units) { 
    $q->enqueue($_); 
} 

# Tell workers they are no longer needed. 
$q->enqueue(undef) for @workers; 

# Wait for workers to end 
$_->join() for @workers; 

優點:

  • 更多可擴展
  • 工程,即使$ num_work_units/$ num_workers不是整數。
  • 不認爲所有工作單位都需要花費相同的時間才能完成。

輸出:

1 
5 
2 
8 
9 
10 
7 
3 
4 
6 
+0

主題::隊列看起來不錯。感謝指針。 – daotoad 2011-06-03 05:52:37