タイマー

実時間プログラムは、予定された時間に実行される関数や、 特定の間隔で繰り返される関数をしばしば要求する。 これまでのEusLispは、Unixのインターバルタイマーによって 定期的に生成される信号によって発生するユーザー関数を 実行することができた。 MT-Eusにおいて、この実行はデッドロックを引き起こす。 なぜなら、割り込みがmutex-lockされたブロック内から発生する可能性がある。 したがって、制御はevalの最初のように安全な場所で渡されなければ ならない。 上記の同期によって引き起こされる遅れを避けるために、 MT-Eusはセマフォを経由して信号通知(signal-notification)も 提供する。 言い換えれば、信号関数は呼び出されるかあるいは信号の到着を知らせる 関数あるいはセマフォのどちらかをとる。 セマフォは、低レベルで告示されるので、 同期により隠れているところは最小である。

以下に示すものは、マルチスレッド機能を用いた画像処理のプログラム例である。 画像入力スレッドとフィルタースレッドが生成される。 samp-imageは、33msec毎に通知されるsamp-semを待つことにより、 定期的に画像データをとる。 2つのスレッドはthread-portの読み書きを通じて同期する。 filter-imageは、フィルターの並列計算のために複数のスレッドを使用している。

(make-threads 8)
(defun samp-image (p)
   (let ((samp-sem (make-semaphore)))
        (periodic-sema-post 0.03 samp-sem)
        (loop (sema-wait samp-sem)
              (send p :write (read-image))))
(defun filter-image (p)
  (let (img)
       (loop (setf img (send p :read))
             (plist (filter-up-half img)
                    (filter-low-half img)))))
(setf port (make-thread-port))
(setf sampler (thread #'samp-image port))
(setf filter (thread #'filter-image port))



2016-04-05