Example17.8

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

17.8 同期チャネル

同期チャネルの実装例を見てみましょう。ここではメッセージの送信者はメッセージが受け取られるまでブロックします。同期チャネルは、転送するメッセージを保持するのにただ1つの変数を必要としますが、リーダーとライタープロセスをうまく連動させるために3つの信号を使います。

 package scala.concurrent

 class SyncChannel[A] {
   private var data: A = _
   private var reading = false
   private var writing = false

     def write(x: A) = synchronized {
       while (writing) wait()
       data = x
       writing = true
         if (reading) notifyAll()
         else while (!reading) wait()
     }

     def read: A = synchronized {
       while (reading) wait()
       reading = true
       while (!writing) wait()
       val x = data
       writing = false
       reading = false
       notifyAll()
       x
     }
 }

名前:
コメント:
最終更新:2011年02月24日 09:15
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。