ワーカスレッドを安全に終了させるまで待機
Posted feedbacks - Ruby
1 2 3 4 5 6 7 8 9 10 11 12 | puts 'Starting: main thread'
n = 4
Array.new(n){|i|
Thread.new(i){|j|
Thread.stop
puts "Starting: #{j+1}th thread."
sleep rand(10)+5
puts "Ended: #{j+1}th thread."
}
}.each{|t| t.wakeup}
sleep 1 while Thread.list.size > 1
puts 'Ended: main thread.'
|
「スレッドプールを作り、スレッドを待機させてから、リクエストを投げて結果を全て受け取る」と言う要求と受け取りました。
このプログラムでは、スレッドプールは残るようになっています。
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 28 29 30 31 32 33 34 35 36 37 38 | #
# Thread pool
#
require 'thread'
THREADS = 5
cmd_queue = Queue.new
result_queue = Queue.new
thread_list = []
puts 'Thread start'
(0..THREADS).each do | no |
thread_list << Thread.new(no) do | no |
puts "Thread #{no} start"
while cmd = cmd_queue.pop
puts "Thread #{no} execute to #{cmd}"
sleep rand(10)+5
puts "Thread #{no} finished"
result_queue.push("#{no}")
end
end
end
puts 'Execute start'
(0..THREADS).each do | no |
cmd_queue.push("cmd #{no}")
end
puts 'Waitting execute'
(0..THREADS).each do
no = result_queue.pop
puts "Result #{no}"
end
puts 'All complete'
|

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