From: Shugo Maeda Date: 2007-02-25T17:03:17+09:00 Subject: [ruby-dev:30412] fastthreadについて 前田です。 ちょっと遅きに失した感もありますが、fastthreadのコードレビューを しましたので、いくつか気付いた点を。 (1) rb_thread_wakeup()のrb_rescue2() rb_thread_wakeup()をrb_rescue2()で実行してThreadErrorを無視する ようにしていますが、THREAD_KILLEDなスレッドはスキップして次の スレッドをwakeupしないと、だれもMutexを獲得できなくなってまずい ような気がします。 (2) Marshalの対応 Marshalでlockでブロックしている時にもdump/loadできるようになって いますが、今のMutexではlock中はdump/loadできないので非互換ですね。 JavaのObjectもdump/loadできる(Javaだとモニタ機構はObjectに備わって います)ので問題ないとは思うのですが、この点については十分検討されて いますでしょうか。 (3) malloc/free malloc/freeを使ってますが、xmalloc/xfreeにした方がよいのでは ないでしょうか。 (4) rb_thread_critical いくつかrb_thread_criticalの操作をしていますが、Cレベルでは ある種のRuby APIを呼ばないかぎりはスケジューリングイベントは 発生しないので不要ではないでしょうか。 (5) Queue QueueはRubyレベルでMutex/ConditionVariableを使って実装した方が いいように思います。 # というか、Queueという名前もちょっとあれなので、1.9では # Thread::Queueとかにした方がいい気も。 そうすると、ListのsizeなどはMutex/ConditionVariableの実現には 不要なので削ることもできますね。 (6) 実績 Mongrelで使っているので実績があるということですが、ConditionVariable は使われていないように思います。 どちらかというとConditionVariableの方が問題が起きやすいかもしれません。 あと、スレッドがらみだとあるアプリケーションで問題ないからといって、 他のアプリケーションで問題ないとはいえないので、複数のアプリケーション で検証した方が望ましいですね。 (7) メンテナ fastthreadのメンテナは誰になるのでしょうか? 最後の方はコードと関係なくなってますね;p 他にも何かあったような気がしますが、忘れました。 全体的に致命的な問題があるわけではない(lib/thread.rbと同じ程度 には上手く動きそう)と思うのですが、ちょっと不安です。 といって今のタイミングでコードをいじるのも恐いのですが、どうする べきでしょうか。 1.8.5もメンテナンスされることですし、このままえいやっと入れて しまってもいいですかね。 # そういえば、ruby_1_8_5のsignal.cの話はmputさんに伝わってるん # でしたっけ。 -- 前田 修吾