From: EGUCHI Osamu Date: 1997-09-19T16:43:06+09:00 Subject: [ruby-list:4446] Re: invalid index of Array えぐち です > でも,rubyにはスレッドがあるのでマーク法は使えないんです.残 > 念ですけど.同時に複数のスレッドが同一の配列をインスペクトし > たらダメですよね. rb_inspect() の中でコンテキストスイッチしちゃうってことですね。 ブロックしちゃえ、、、それじゃ thread の意味が半減ですね。 デッドロック問題が明らかに有りそうだし、、 参照中の配列をセルとする線形リストを作って cur_thread にそれのポインタを入れるというのはどうでしょう? struct AREF { struct AREF* last; void* ptr; }; strruct thread に struct AREF ary_inspect(RArray* ary) { struct AREF aref; aref.last = cur_thread->aref; aref.ptr = ary; for (AREF* ap = cur_thread->aref; ap != 0; ap = ap->last) { if (ary == ap->ptr) { // recursive!! return ...; } } cur_thread->aref = aref; .... cur_thread->aref = cur_thread->aref->last; } // cur_thread->aref は生成時に 0 で初期化 いかにもコストが掛かりそうですね、 alloc 関係はハードのスタック上ですが検索コストが大きそうです。 #ruby の実装は thread と GC が絶妙なので、 #このへんうかつに触ると、鬼が棲んでいそうな気もします ^^; #とくに volatile のつけ忘れとか、それを無視する cc とか. それにしても setjmp で thread つくって GC と折り合わせるなんてすごい!! # Array のほかに Hash も同じ問題があるのと思うです。