为什么要打印12次?

Ant*_*ton 5 perl

我正在学习Perl的多线程.我的代码:

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);
Run Code Online (Sandbox Code Playgroud)

我想在线程中打印单词test $howmany times $threads.此代码打印测试 12次.问题出在哪儿?

ike*_*ami 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;
Run Code Online (Sandbox Code Playgroud)

好处:

  • 更具可扩展性
  • 即使$ num_work_units/$ num_workers不是整数也可以工作.
  • 不要假设所有工作单位都需要相同的时间来完成.

输出:

1
5
2
8
9
10
7
3
4
6
Run Code Online (Sandbox Code Playgroud)


Nem*_*emo 10

然后我认为你想要for (0..$threads-1)for (1..$threads)不是for (0..$threads)

:-)