同期

Solarisオペレーティングシステム内には、マルチスレッドプログラムのために 4つの同期手法がある。 Euslispは、mutex-lockとcondition variableとセマフォを提供している。 reader-writer lockは実現されてない。 これらの手法に基づいて、同期メモリポートや同期障壁のような 高レベルの同期機構が実現されている。



sys:make-mutex-lock [関数]

mutex-lockを作り、返す。 mutex-lockは、6つの要素を持つ整数ベクトルで表現されている。


sys:mutex-lock mlock [関数]

mutex-lockのmlockをロックする。 もし、mlockが既に他のスレッドからロックされているなら、 mutex-lockはロックが外されるまで待つ。


sys:mutex-unlock mlock [関数]

mlockを解除し、このロックを待っている他のスレッドの内の1つが再び実行され始める。


sys:mutex mlock &rest forms [マクロ]

mutex-lockとmutex-unlockは、組みで使用されなければならない。 mutexは、重要な部分をひとまとまりにしたマクロである。 mlockは、評価するformsが評価される前にロックされる。 そして、評価が終了したときに、ロックが解除される。 このマクロは、以下のprogn formに展開される。 unwind-protectは、formsの評価中にエラーが発生したとき でさえ、ロックの解除を保証するために使用されることに注意すること。


  (progn
      (sys:mutex-lock mlock)
      (unwind-protect
          (progn . forms)
          (sys:mutex-unlock mlock)))

sys:make-cond [関数]

4つの要素を持つ整数ベクトルであるcondition variableオブジェクトを 作る。condition variableの返り値としては、ロックされてない状態でである。


sys:cond-wait condvar mlock [関数]

condvarに信号が出されるまで待つ。 もし、condvarが他のスレッドによってすでに獲得されていたならば、 mlockを解除し、condvarに信号が出されるまで待つ。


sys:cond-signal condvar [関数]

condvarで示されるcondition variableに信号を出す。


sys:make-semaphore [関数]
20の要素を持つ整数ベクトルによって表現されるセマフォオブジェクトを作る。


sys:sema-post sem [関数]
semに信号を出す。


sys:sema-wait sem [関数]
semに信号が来るまで待つ。



sys:barrier-synch [クラス]


  :super   propertied-object 

:slots threads n-threads count barrier-cond threads-lock count-lock


同期障壁のための構造を表現する。 同期を待っているスレッドは、thread-lockによって 相互に排除されるthreadに置かれる。 barrier-synchオブジェクトが生成されたとき、 countは、ゼロに初期化される。 同期しているスレッドは、:addメッセージを送ることによって、 threadsリストに置かれる。 このbarrier-synchオブジェクトに:waitを送ることは、 countを増加させることの原因となり、 送られたスレッドは待ち状態になる。 threadsの中のすべてのスレッドに:waitメッセージが送られたとき、 待ちが解除され、すべてのスレッドの実行が再び始まる。 同期は、count-lockのmutex-lockとbarrier-condのcondition-variable の組み合わせによって実行される。


:init [メソッド]

このbarrier-synchオブジェクトを初期化する。 2つのmutex-lockと1つのcondition-variableが生成される。


:add thr [メソッド]
threadsリストの中にthrスレッドが追加される。


:remove thr [メソッド]
threadsリストの中からthrスレッドを削除する。


:wait [メソッド]
threadsリストの中のすべてのスレッドに:wait が配布されるのを待つ。



sys:synch-memory-port [クラス]


  :super   propertied-object 

:slots sema-in sema-out buf empty lock


1方向の同期されたメモリポートを実現する。 このオブジェクトを通じてデータを転送するために、2つのスレッドを同期させる。 転送制御は、セマフォを用いて実現されている。


:read [メソッド]

このsynch-memory-portにバッファされているデータを読む。 もし、まだ書かれていなかったならば、:readは停止する。


:write datum [メソッド]

バッファにdatumを書き込む。 1ワードのバッファのみ存在するので、 もし他のデータが既に書かれておりまだ読まれていなかったならば、 :write:readによってそのデータが読み込まれるまで待つ。


:init [メソッド]

このsync-memory-portを初期化する。 これには2つのセマフォが生成され、:write動作が可能な状態になっている。


2016-04-05