咳といいます

From: matz / netlab.co.jp (Yukihiro Matsumoto)
Subject: [ruby-list:23765] Re: context switch during finalizer(Re:  Re: Flyweight)
Date: Mon, 10 Jul 2000 09:17:03 +0900

> |次に、なぜ「finalizerの中ではスイッチしないのかな?」と思ったかに
> |ついてです。
> 
> (中略)
> 
> なるほど。多くのライブラリはあんまりスレッドのことを考慮せず
> に書いてあります、かもしれません。スレッド標準装備をうたって
> るんだから、もうちょっとスレッド対応が簡単な方がよいかも。
> Javaのsyncronized構文とか導入した方が良いのかなあ。
> 
> weakrefは対応します。

preview 版 1.4.6 は対応されていないようです。

それで自分でパッチを書こうかと思ってちょっと試したんですが、
なかなかうまくできません。Mutexで保護するだけでよいと
思ったんだけどなぁ。

テストに使ったスクリプトはこんなのなんですけど、
間違ってるでしょうか?

	require 'weakref'

	def foo(it)
	  Thread.new do
	    loop do
	      p WeakRef.new(it)
	    end
          end
        end

        Thread.abort_on_exception = true
        list = []
        org = "Hello, World."

        10.times do 
          list.push(foo(org))
        end

        sleep 30	# 30秒動けばいいや。

ところで、
finalizerって、すべてのコールバックを呼び終ってから、
GCされるオブジェクトが本当の(?)リサイクル対象となるのですか ?

finalizerを呼び終えるまで、そのIDは再利用されない ??