私は膨大な量のスレッドを開始するプログラム(Perl)を持っています(それぞれがデータ処理に基づいてグラフィックを作成することを担当しています)。私が使い始めた各スレッド:
my @threads //list to store threads that have been launched
push @threads,threads->create(\mySubName,params...);
スレッドは正しく起動しますが、しばらくすると、いくつかのスレッドを開いた後、Perlインタープリターがクラッシュします(メモリに関連していると思いますか?)。したがって、私の解決策は、一度に開くスレッドの数を制限することです。15を選択しました。そして、各作成行の前にサブを追加して、次のスレッドを起動するか、待機中にスリープを実行してもよいかどうかを確認します。 1つを終了します。これが私がやろうとした方法です。
sub checkThreads{
my $addThread = 0;
until($addThread){
my $totalThreads = 0;
foreach my $task (@threads){
if($task->is_running()){$totalThreads++;}
}
if($totalThreads <= 15 ){
print "Ok to add new thread, carry on!\n";
$addthread = 1;
}else{
print "Waiting for $totalThreads threads to fire next one...\n";
sleep 2;
}
}
}
したがって、新しいスレッドを作成するたびに、
&checkThreads;
そして、いくつかのスレッドがクリーンアップされるのを待つ間、遅延を作成するように注意します。問題は、私がそのサブを呼び出すとき、私がチェックするラインに到達した瞬間です:
$task->is_running()
プログラムは終了し、エラーや警告なしに実行を停止します。実行中のスレッドをカウントして制限するサブが必要です。
このカウントを正常に実行するにはどうすればよいですか?
私が試した他のことは、次の行を評価することです。
scalar(threads->list());
しかし、それは私に奇妙な価値を与えます。それは私が信じている祝福されていない参照であるように、次のようになります。
threads=SCALAR(0x80fea8c)