From: shugo@... (maeda shugo) Date: 1997-07-29T01:20:57+09:00 Subject: [ruby-list:3528] Re: [Q] Thread 前田です。 keiju@bc.mbn.or.jp (石塚圭樹 ) san wrote: |>thread awareが必要なライブラリもありますが(たとえばtk),基本 |>的にはaだと思っています. | |についてですが, そのオブジェクトに対して排他制御するのであれば, Mutex |を使えば実現できるんでしょうけど, 下図の様に, 内部に依存したオブジェク |トがあってそれに対して排他制御を行わなくてなならないパターンの場合: | | a_Foo_1 -+ | +--> a_Bar | a_Foo_2 -+ | | a_Barを同時アクセスすると異常動作する. | |ユーザレベルでは対応できなくて(しよう思うとThread.critical = FALSEしか |ない), クラスライブラリレベルで対応してもらわないと困りますね. a_Barのクラスも安全に排他制御するように設計しておけば大丈夫ではないでしょうか? module Synchronizable def check_mutex @mutex = Mutex.new if @mutex == nil end private :check_mutex def lock check_mutex @mutex.lock end def locked? check_mutex @mutex.locked? end def synchronize check_mutex @mutex.synchronize { yield } end def try_lock check_mutex @mutex.try_lock end def unlock check_mutex @mutex.unlock end end みたいなモジュールを用意しておいて、排他制御したい時は class Foo include Synchronizable # 同時にアクセスされたくないメソッド def synchronized_method synchronize { ... } end end のようにすればそんなに手間はかからないと思うのですがどうでしょう? -- 前田 修吾