From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2011-01-26T15:36:23+09:00 Subject: [ruby-dev:43120] Re: pthread_cond を用いたConditionVariable けいじゅ@いしつかです. In [ruby-dev:43101] the message: "[ruby-dev:43101] Re: pthread_cond を 用いたConditionVariable", on Jan/25 17:50(JST) KOSAKI Motohiro writes: >> の部分は、native_mutex_lock の直前に別スレッドで CV#signal が呼ばれたとき、 >> signal が無視される気がしました (気のせいかもしれませんが) 。 >> >> + native_mutex_lock(&arg->cv->lock); >> + BLOCKING_REGION_CORE({ >> + th->transition_for_lock = 0; >> + native_cond_wait(&arg->cv->cond, &arg->cv->lock); >> + th->transition_for_lock = 1; >> + }); >> + native_mutex_unlock(&arg->cv->lock); >> >> とすればいい、のかなあ。 > >ええと、いままではGVL持ってるときは他のロックとるの禁止にしてますよね。 >GVLスレッドが待ってしまうと、全部止まるから。 > >若干危険な香りがします。 実際に試してみればよいということで, 試してみました. やはり, deadlockするようです. BLOCKING_REGION_CORE({ を抜けるところと, rb_cv_signal(VALUE self) の native_mutex_lock(&cv->lock); のところで, デッドロックしています. 何か回避のヒントあります? __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---