challenge ワーカスレッドを安全に終了させるまで待機

スレッドプールに複数のワーカスレッドが待機しており、メインスレッドはいつでもワーカスレッドに仕事を渡せるような状態になっているとします。

さて、メインスレッドからスレッドプールにいくつか仕事を与え、メインスレッドは与えた仕事すべてが終了するまで待機し、次の処理に行ってはいけない、というようなコードを書いてください。 #現実に書く機会が多そうなコードですね…。

ここでの仕事の内容は、適当に5秒から15秒の間スレッドをスリープする、というもので結構です。 また、ワーカスレッドのスレッドプール自体の使用を終了するか、または残して再利用するかは問いません。できればコメントにスレッドプールを残したかどうかを書いてください。

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'

Index

Feed

Other

Link

Pathtraq

loading...