私はperlの初心者なので、私の無知を許してください。(私はwindows7を使用しています)
私は echiken のスレッドのサンプル スクリプトを借りて、それをスクリプトの基礎として使用して多数のシステム コールを作成したいと考えていましたが、理解できない問題に遭遇しました。私が見ている問題を説明するために、以下のサンプル コードで単純な ping コマンドを実行しています。
$nb_process
許容される同時実行スレッドの数です。$nb_compute
サブルーチンを実行したい回数として (つまり、ping コマンドを発行する合計回数)。
$nb_compute
と$nb_process
を同じ値に設定すると、完全に機能します。
ただし、$nb_process
(一度に実行するスレッドの数を制限するために)減らすと、で定義されたスレッドの数$nb_process
が開始されるとロックされるようです。
システム コール (ping コマンド) を削除すると、正常に動作します。
他のシステム コールでも同じ動作が見られます (ping だけではありません)。
誰か助けてください。以下にスクリプトを用意しました。
#!/opt/local/bin/perl -w
use threads;
use strict;
use warnings;
my @a = ();
my @b = ();
sub sleeping_sub ( $ $ $ );
print "Starting main program\n";
my $nb_process = 3;
my $nb_compute = 6;
my $i=0;
my @running = ();
my @Threads;
while (scalar @Threads < $nb_compute) {
@running = threads->list(threads::running);
print "LOOP $i\n";
print " - BEGIN LOOP >> NB running threads = ".(scalar @running)."\n";
if (scalar @running < $nb_process) {
my $thread = threads->new( sub { sleeping_sub($i, \@a, \@b) });
push (@Threads, $thread);
my $tid = $thread->tid;
print " - starting thread $tid\n";
}
@running = threads->list(threads::running);
print " - AFTER STARTING >> NB running Threads = ".(scalar @running)."\n";
foreach my $thr (@Threads) {
if ($thr->is_running()) {
my $tid = $thr->tid;
print " - Thread $tid running\n";
}
elsif ($thr->is_joinable()) {
my $tid = $thr->tid;
$thr->join;
print " - Results for thread $tid:\n";
print " - Thread $tid has been joined\n";
}
}
@running = threads->list(threads::running);
print " - END LOOP >> NB Threads = ".(scalar @running)."\n";
$i++;
}
print "\nJOINING pending threads\n";
while (scalar @running != 0) {
foreach my $thr (@Threads) {
$thr->join if ($thr->is_joinable());
}
@running = threads->list(threads::running);
}
print "NB started threads = ".(scalar @Threads)."\n";
print "End of main program\n";
sub sleeping_sub ( $ $ $ ) {
my @res2 = `ping 136.13.221.34`;
print "\n@res2";
sleep(3);
}