From: Motohiro KOSAKI Date: 2011-06-21T10:33:47+09:00 Subject: [ruby-dev:43859] [Ruby 1.9 - Bug #4911][Open] timer_thread_function() が thead unsafe Issue #4911 has been reported by Motohiro KOSAKI. ---------------------------------------- Bug #4911: timer_thread_function() が thead unsafe http://redmine.ruby-lang.org/issues/4911 Author: Motohiro KOSAKI Status: Open Priority: Normal Assignee: Motohiro KOSAKI Category: core Target version: 1.9.x 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://redmine.ruby-lang.org