Example17.6

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)
   }
 }

名前:
コメント:

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2011年02月24日 09:14
ツールボックス

下から選んでください:

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