Next: Up: Previous:

cky-matrix-elementクラスの実現

  さてここで, tex2html_wrap_inline1082 を格納し, かつ生産者と消費者の同期を実現するオブ ジェクトのクラス, cky-matrix-elementを実現することを考える. こ こでの記述は一人の生産者がデータを生成し, それを全ての消費者に渡すため のテンプレートになっている.

これを実現するもっとも無駄のない方法は, ABCL/fのfirst class reply box の機能を使って, 「ある条件が満たされるまで返事を返さない」様なmethodを 書くことである. 具体的には以下のようにする.

(defmethod! cky-matrix-element sync-get! (i j)
  :reply-to r
  (declare (fixnum i j) (reply-type (list fixnum)))
  (if present
      (become (reply val r))
      (become unit :waitors (cons r waitors))))
まず最初の, :reply-to rは, このmethodが起動された時に受けとった, reply boxを表していて, その型は, (list fixnum)を返すmethodの場 合, (future (list fixnum))となる. 呼出側が普通に,
(sync-get! x i j)
のようにsync-get!を起動した場合, rに渡されれるものは, 新 しい空のreply boxである. Methodの本体では, presentが真の場合, rvalueを返している. これによって呼出側はすぐさま valueを呼び出しの返り値として受けとる. 一方presentが偽の 場合, それはwaitorsというlistにつながれ, このmethod内では返事は 返されない. これによって呼出側はしばらくの間待ち続けることになる. 後か ら, sync-put!によって返事が供給された時に, 以下のように返事が返 される.
(defmethod! cky-matrix-element sync-put! (v i j)
  (declare ((list fixnum) v) (fixnum i j) (reply-type unit))
  (become (dolist (r waitors) (reply v r)))
   :present true :val v :waitors '())

Mitsubishi Research Institute,Inc.
Thu Feb 27 10:02:38 JST 1997