From: Okada Jun Date: 2001-05-08T03:28:12+09:00 Subject: [ruby-list:29584] [BUG?] Thread の終了時に Thread.critical が解除されない。 岡田です。 スレッドの同時起動数を制限する目的で、次のようなコードを書きました。 #!/usr/bin/env ruby # スレッドの状態を1秒毎に監視 Thread.start do loop do puts Thread.list.size.to_s, Thread.main.inspect sleep 1 end end # 最大同時起動数100でスレッドを連続して起動 500.times do Thread.start do sleep(1) Thread.critical = true Thread.main.wakeup # Thread.critical = false end Thread.critical = true Thread.stop if Thread.list.size >=102 Thread.critical = false end # 全てのスレッドの終了を待つ loop do Thread.critical = true if Thread.list.size <= 2 Thread.critical = false break end Thread.stop end 問題となるのは、threadの最後にコメントアウトしているThread.critical = falseの部分です。 このようにコメントアウトしたままだと、critical状態が解除されずに、スクリプトは終了 しなくなってしまいます。 マニュアルの記述によれば、 > critical = yes_no > 真である場合,スレッドの切替えを行いません. カレントスレッドが停止した場合やシグナ > ルに割り込まれた場合には,自動的に false になります. とあるので、スレッドの終了時に自動的に解除されるものと思っていたのですが、 このスクリプトの形で期待通りに動作しないのは内部的にどういう動作をして いるのでしょうか? ちなみにこの動作を確認したのは Intel Pentium III 700MHz (FC-PGA) 512MB (PC100-CL2 128MB x 4) FreeBSD 4.1.1-STABLE-20001022-JPSNAP #2 ruby 1.6.3 (2001-03-19) [i386-freebsdelf4.1.1] という環境です。 -- ゆん(岡田 潤) yun@nekome.net http://www.nekome.net/