Issue #8065 has been reported by kosaki (Motohiro KOSAKI).
Backport #8065: r39688 - test_queue.rb (test_thr_kill): reduce
iterations from 2000 to 250. のバックポート
Author: kosaki (Motohiro KOSAKI)
Status: Assigned
Priority: Normal
Assignee: nagachika (Tomoyuki C.)
Category:
Target version:
現在、uniprocessor環境で test_thr_killを実行すると、ほぼ必ず失敗します。原因はコミットログにも書いたのですが
以下の様なスクリプトがあるとき、
total_count.times do |i|
open(“test_thr_kill_count”, “w”) {|f| f.puts i }
queue = Queue.new
r, w = IO.pipe
th = Thread.start {
queue.push(nil)
r.read 1
}
queue.pop
th.kill
th.join
end
ほぼ確実に、
1、Thread.start
2.Queue.pop
3,ここでコンテキストスイッチ
4,Queue.push
5.r.readの処理の途中で gvl_release()
6.ここでコンテキストスイッチ
7.th.kill → ubf_select → pthread_kill(SIGVTALARM) とくるが、
別に、ブロッキングシステムコールで寝ているわけではないので
サブスレッドには影響ない
8.th.join
9.ここでコンテキストスイッチ
10.read(2) を呼ぶ
11.ここで動いているスレッドが一旦いなくなる
12.100msec後にtimer threadがSIGVTALARMを再送、read()が解除される
と動くので、30秒間では300回しかループが回りません。
状況証拠的に [Bug #7521] の原因だと見ています。確証はないので、別チケットにしましたが。