Grand Central Dispatch(GCD)を使用して、リソースへのアクセスを制御する同時読み取り専用書き込みモデルを実装する適切な方法を理解しようとしています。
頻繁に読み取られ、たまに更新されるNSMutableDictionaryがあるとします。読み取りが常に辞書の一貫した状態で機能することを保証する適切な方法は何ですか?確かに、キューを使用して、ディクショナリへのすべての読み取りおよび書き込みアクセスをシリアル化できますが、それでは、ディクショナリへの同時アクセスを許可する必要がある読み取りが不必要にシリアル化されます。最初、ここでのグループの使用は有望に聞こえます。'read'グループを作成し、それにすべての読み取り操作を追加することができます。これにより、読み取りを同時に行うことができます。そして、更新を行うときが来たら、書き込み操作の一部としてdispatch_notify()またはdispatch_wait()を実行して、更新を続行する前にすべての読み取りが完了していることを確認できます。しかし、書き込み操作が完了するまで後続の読み取り操作が開始されないようにするにはどうすればよいですか?
上記の辞書の例を次に示します
。R1:0秒で、読み取りが完了し、5秒で完了します
。R2:2秒で、別の読み取りが完了し、5秒で完了します
。W1:4秒で、書き込み操作が実行されます。辞書に3秒間アクセスする必要があります
R3:6秒で別の読み取りが行われ、完了するまでに5秒かかります
W2:8秒で、別の書き込み操作が行われ、完了するまでに3秒かかります
理想的には、上記は次のように再生されます
。R1は0秒で始まり、5で終わります
R2は2秒で始まり、7で終わります
W1は7秒で始まり、10で終わります
R3は10秒で始まり、15で終わります
W2は15秒で始まります、18で終了
注:R3は6秒で到着しましたが、W1が早く到着したため、W1より前に開始することはできませんでした。
GCDで上記を実装するための最良の方法は何ですか?