From: nagai@... Date: 2002-05-17T14:47:53+09:00 Subject: [ruby-dev:17128] Thread: deadlock trouble 永井@知能.九工大です. 以下に示すようなケースなんですが,どうにか改修する手はないものでしょうか? 問題は,Tk から呼び出された手続きで Thread を生成し, その Thread の中から Tk を呼び出した際に生じます. 例えば,次を動かしたとします. ------------------------------------------------------ require 'tk' b1 = TkButton.new(nil, 'text'=>"b1:{p 'b1'}", 'command'=>proc{p 'b1'}).pack b2 = TkButton.new(nil, 'text'=>"b2:{Thread{p 'b2'}}", 'command'=>proc{Thread.new{p 'b2'}.value}).pack TkButton.new(nil, 'text'=>'{b1.invoke}', 'command'=>proc{b1.invoke}).pack TkButton.new(nil, 'text'=>'{b2.invoke}', 'command'=>proc{b2.invoke}).pack TkButton.new(nil, 'text'=>'Thread{b1.invoke}', 'command'=>proc{Thread.new{b1.invoke}.value}).pack TkButton.new(nil, 'text'=>'Thread{b2.invoke}', 'command'=>proc{Thread.new{b2.invoke}.value}).pack Tk.mainloop ------------------------------------------------------ この例で上から 4 個のボタンについては期待通りに働きます. ですが,下 2 個のボタンについては,例えば ------------------------------------------------------ deadlock 0x4018dc30: 2:0 - /usr/local/lib/ruby/1.6/tk.rb:559 deadlock 0x401305a0: 2:8 (main) - -:8 (eval):524:in `mainloop': -:8:in `value': Thread: deadlock (fatal) from /usr/local/lib/ruby/1.6/tk.rb:524:in `mainloop' from -:11 ------------------------------------------------------ というように,deadlock を生じてしまい,ダメです. # このメッセージは ruby 1.6.1 (2000-09-27) [i586-linux] のものですが, # 新しいバージョンでも同様のエラーを生じます. これは, ・リソースデータベースのサポートで,Thread を使って 外部定義手続きを特定のセーフレベルで実行したいけれど, そうした手続きから他の widget をいじろうとすると deadlock で落ちる. ・Tcl_DoOneEvent を使った Tk.mainloop の代換品を検討していて Thread{loop{TclTkLib.do_one_event(EventFlag::ALL | EventFlag::DONT_WAIT)}} などとしてテストしてみたら,deadlock で落ちた. というようなことをやっていて遭遇した状況です. Thread 周りが理解できていないもので自力では対処できませんでした. よい対策があればぜひ教えてください. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp