2011-06-03 163 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