>> どのみちConditionVariableでThread#raiseを使ってませんでしたっけ?と思ったら時間指定している時だけですね。 > 使っていないように思うんですが、どこで使ってますか? 次の日の朝には気づいて訂正のメールを出そうか考えたのですが、それだけで出すのもどうかと思い放置してました。 お手数をわずわらせたならすいません。 >> ConditionVariableとほぼ同じになりますが、 >> m.synchronize { predicate = ture ; th.run } >> がよいでしょうか? > > これは race condition がありますね。 > 問題のスレッドがロックを外した後、sleep する前に > コンテキストスイッチして th.run が動くと、 > その th.run は無視されて、寝てしまうんじゃないでしょうか。 本当ですね。。。 Thread#runで起こす時にはm.sleepを使わないとrace conditionが発生すると言うことですね。 そうすると今のRubyの仕様で共有変数を使った制御ではConditionVariableとまったく同じになる = ConditionVariableを使えばいいじゃないかという事、了解しました。 >> もちろん、Thread#raiseを取り巻く今の仕様の悪さは理解してるので何も考えずに使うのはどうかと思いますが、 >> 状況次第ではないでしょうか? >> ConditionVariable はmのロック状況次第でどれだけ遅延するか分からないので、 >> Thread#raiseとどちらがいいかは状況によって変わると思います。 >> 剣呑といっても正しく使う分には便利な制御です。 > > 定期的な処理 ([ruby-core:27698] でいえば cleaning function) を実行している > 最中は中断したくないとすると、Thread#raise を使う場合でも m をロックしないと > いけないでしょう。 > > [ruby-dev:41310] で Thread#raise を m.synchronize のブロックの中に入れてある > のはそういうことだと思っていたんですが違うんでしょうか。 [ruby-dev:41310]については、そういう意図であっています。 [ruby-dev:41323]でいっている遅延については、signalを受けた後のlockについて言っています。 もともとの命題が「シグナルされたらすぐに終了」だったので。 -- 樽家昌也(Masaya TARUI) No Tool,No Life.