From: "ko1 (Koichi Sasada)" <redmine@...> Date: 2012-09-22T07:10:26+09:00 Subject: [ruby-dev:46153] [ruby-trunk - Bug #4911] timer_thread_function() が thead unsafe Issue #4911 has been updated by ko1 (Koichi Sasada). 問題はわかったのですが, これがどうして解決するのかわかりません. (結局,+ if (!vm->running_thread->yielding) の部分で running_thread を触っているように見える) 解説してもらえないでしょうか. ---- では,どうやって解決するかというと難しいですね.タイマスレッドが動いている間は free しない,とか,そういうのになりそうな感じ. ---------------------------------------- Bug #4911: timer_thread_function() が thead unsafe https://bugs.ruby-lang.org/issues/4911#change-29647 Author: kosaki (Motohiro KOSAKI) Status: Assigned Priority: Normal Assignee: ko1 (Koichi Sasada) Category: core Target version: 2.0.0 ruby -v: trunk どうして、これを先月気づかなかったのだろう。という罪悪感があるのですが、 target 1.9.x で起票します。 timer_thread_function()で vm->running_thread にアクセスするのは thread unsafe な気がします 0.スレッドAがrunning_threadである 1.タイマースレッドがvm->running_threadをレジスタにのせる (レジスタにスレッドAのアドレスがのっかる) 2.コンテキストスイッチ 3.スレッドAが終了。スレッドBがrunning_threadになる 4.スレッドAの rb_thead_t がfreeされる 5.コンテキストスイッチ 6.そんなkとはつゆしらず、タイマースレッドはスレッドAの アドレスに対して th->interrupt_flag |= 1; するのでメモリ破壊 ---------------------------------------------------------- static void timer_thread_function(void *arg) { rb_vm_t *vm = GET_VM(); /* TODO: fix me for Multi-VM */ /* for time slice */ RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread); ※ここ /* check signal */ rb_threadptr_check_signal(vm->main_thread); } -- http://bugs.ruby-lang.org/