ワーカスレッドを安全に終了させるまで待機
Posted feedbacks - Perl
Perlでthreadsを使うためには、-DusethreadsをつけてConfigureする必要がありますが、いちおうそうなっているという前提で。
本質的なのは、
1 while threads->list(threads::running);
だけです。threadsを再利用するか否かは関係なく使えます。
どちらかというと、threadsは使い捨てにした方がコードは書きやすいですね。
Dan the Threaded Perl Monger
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/usr/local/bin/perl
use strict;
use warnings;
use threads;
use Time::Hires qw/sleep/;
my @thr;
for my $i ( 1 .. shift || 10 ) {
push @thr, threads->create(
sub {
my $n = shift;
my $s = rand(10.0);
sleep $s;
warn "$n:slept $s sec.";
},
$i
);
}
1 while threads->list(threads::running);
warn "All Threads Done";
$thr[0]->join(); # on purpose
END {
$_->is_joinable() and $_->join() for @thr;
}
|


todogzm
#4822()
Rating4/4=1.00
スレッドプールに複数のワーカスレッドが待機しており、メインスレッドはいつでもワーカスレッドに仕事を渡せるような状態になっているとします。
さて、メインスレッドからスレッドプールにいくつか仕事を与え、メインスレッドは与えた仕事すべてが終了するまで待機し、次の処理に行ってはいけない、というようなコードを書いてください。 #現実に書く機会が多そうなコードですね…。
ここでの仕事の内容は、適当に5秒から15秒の間スレッドをスリープする、というもので結構です。 また、ワーカスレッドのスレッドプール自体の使用を終了するか、または残して再利用するかは問いません。できればコメントにスレッドプールを残したかどうかを書いてください。
[ reply ]