Actions
Bug #7455
closedQueue#popで待っている間にtrapに入りその時にQueue#pushされると、Queue#popから戻ってこなくなる。
Description
以下スクリプトを実行すると期待したように終わらずに、deadlockしてしまいます。
ささださんよろしく。
require 'thread'
que = Queue.new
th = Thread.new{
sleep 0.1
Process.kill(:INT,$$)
sleep 0.1
que.push 2
}
Signal.trap :INT do
p :trap_task
123456**100000 / 456 ** 10000
p :trap_task_end
end
puts "que.pop"
p que.pop
puts "success!"
Updated by kosaki (Motohiro KOSAKI) about 12 years ago
とりあえず原因を書いておくと
- que.popで、mutex.sleepが呼ばれ、結局sleep_forever()が呼ばれる。ここで一旦 status = THREAD_STOPPED_FOREVERになる
- Process.kill をうけて status = THREAD_RUNNABLEにしてトラップハンドラを実行はじめる
- que.push を呼ぶが、main threadはすでに thread runnableなので何もおこらず
- サブスレッド死ぬ
- trap抜けたところで rb_threadptr_execute_interrupt()内の th->status = prev_status; の処理によって、
statusがTHREAD_STOPPED_FOREVERに戻る
6.sleep_forever() は status != THREAD_RUNNABLE の場合sleepを再実行するので、ここでデッドロックチェック
唯一残っているスレッドであるメインスレッドが THREAD_STOPPED_FOREVERなので、めでたくチェックにひっかかり強制終了
ささださん、よろしく
Updated by ko1 (Koichi Sasada) about 12 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r37944.
Masaya, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
add ticket ref: [ruby-dev:46654] [ruby-trunk - Bug #7455]
Actions
Like0
Like0Like0