Example17.6

「Example17.6」の編集履歴(バックアップ)一覧に戻る

Example17.6 - (2010/10/24 (日) 10:59:14) の編集履歴(バックアップ)


17.6 リーダー/ライター

より複雑な同期の形態では、共通リソースを変更することなくアクセスする リーダー と、アクセスと変更の両方が可能な ライター を区別します。リーダーとライターを同期させるために startRead、startWrite、endRead、endWrite、その他を実装する必要があります。

  • 多数の並行リーダーがある
  • 同時にはただ1つのライターのみ可能
  • ペンディング中の書き込み要求は、ペンディング中の読み込み要求よりも優先するが、実行中のリード操作をプリエンプトしない

次のリーダー/ライター ロックの実装は メールボックス に基づいています (17.10節参照)。

 import scala.concurrent._

 class ReadersWriters {
   val m = new MailBox
   private case class Writers(n: Int), Readers(n: Int) { m send this }
   Writers(0); Readers(0)
   def startRead = m receive {
     case Writers(n) if n == 0 => m receive {
       case Readers(n) => Writers(0); Readers(n+1)
     }
   }
   def startWrite = m receive {
     case Writers(n) =>
       Writers(n+1)
       m receive { case Readers(n) if n == 0 => }
   }
   def endRead = m receive {
     case Readers(n) => Readers(n-1)
   }
   def endWrite = m receive {
     case Writers(n) => Writers(n-1); if (n == 0) Readers(0)
   }
 }

名前:
コメント:
ツールボックス

下から選んでください:

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