0

私はPerlを初めて使用し、スレッドの使用を必要とするプログラムを作成しています。Perlでスレッド機能を見つけましたが、まだ少し混乱しています。この投稿のタイトルで述べられているように、Javaはおそらくスレッドを使用するのに最も一般的です。完璧だと言っているわけではありませんが、Threadクラスを使用して仕事を終わらせることができます。

JavaにはstartThreadsというメソッドがあり、そのメソッドでスレッドを作成してから開始しました。それらを開始した後、トレッドが完了したかどうかをチェックするwhileループがあります。すべてのスレッドが適切に終了した場合、whileループは終了しますが、そうでない場合、whileループは、どのスレッドがタイムアウトしたかを監視し、それらのスレッドを安全に中断して、シャットダウンフラグをtrueに設定します。

問題:Perlでは、上で述べたのと同じアルゴリズムを使用したいのですが、もちろんPerlには違いがあり、Perlは初めてです。他のスレッドが実行されている間にwhileループを実行することは可能ですか?それはどのように行われますか?

4

3 に答える 3

2

whileを使用して Perl でループを実装できますthreads->list()が、最初に別のアプローチを検討する必要があります。

スレッドを待つ代わりに、結果を待つのはどうですか?

ここでの基本的な考え方は、ワーク ユニットをキューから取得し、ワーク ユニットの結果 (オブジェクトまたは例外) を出力キューに入れるコードがあるということです。

入力キューで作業単位を待機するいくつかのスレッドを開始します。1 つが表示されたら、作業単位を実行し、結果を出力キューに入れます。

メイン コードでは、すべての N 個のワーク ユニットを入力キューに入れる必要があります (十分な大きさであることを確認してください)。その後、出力キューで N 個の出力を待つことができ、スレッド、結合、および例外について心配する必要はありません。

[編集]すべての質問はhttp://perldoc.perl.org/perlthrtut.htmlで回答する必要があります

于 2012-04-30T09:10:14.367 に答える
1

perl でスレッドを使用する場合は注意してください。共有データに安全にアクセスするには、さまざまなニュアンスがあります。ほとんどの Perl コードはスレッド化を行わないため、スレッドセーフなモジュールはほとんどありません。

于 2012-05-01T17:11:26.883 に答える
0

Michael Slade が提供したリンクを読んだ後、Cyber​​-Guard Enterprise が正しいことがわかりました。スレッドを切り離すことにより、メインはまだ作業を実行しています。まだテストしていませんが、 $thr->is_running() はスレッドがまだ実行中かどうかを教えてくれるようです。

これは提供された URL から取得したもので、detach の使用方法を示しています。perldoc.perl.org/perlthrtut.html?

use threads;
my $thr = threads->create(\&sub1); # Spawn the thread
$thr->detach(); # Now we officially don't care any more
sleep(15); # Let thread run for awhile
sub sub1 {
$a = 0;
while (1) {
$a++;
print("\$a is $a\n");
sleep(1);
}
}
于 2012-05-01T05:43:39.183 に答える