10

私のアプリケーションはGCDを多用しており、ほとんどすべてがディスパッチによって処理される小さなタスクに分割されています。ただし、基になるデータモデルはほとんどが読み取られ、たまにしか書き込まれません。

私は現在、読み取り中に重要なデータ構造が変更されないようにロックを使用しています。しかし、今日ロックをもう少し調べた後、NSConditionLockと読み取り/書き込みロックに関するページを見つけました。後者はまさに私が必要としているものです。

私はこの実装を見つけました:http://cocoaheads.byu.edu/wiki/locks。私の質問は、この実装はPThreadsを使用していることを確認して、GCDで機能するでしょうか?

4

2 に答える 2

27

それでも動作します。pthreadsは、Mac OS Xで他のすべてのスレッド使用API​​の基礎となるスレッドAPIです(その下では、Machスレッドのアクティブ化がありますが、APIではなくSPIです)。とにかく、pthreadsロックではpthreadを使用する必要はありません。スレッド。

ただし、GCDは、iOS5の時点でより優れた代替手段を提供しますdispatch_barrier_async()。基本的に、プライベート並行キューがあります。通常の方法で、すべての読み取り操作を送信します。バリアルーチンを使用して、書き込み操作を送信します。タダ!読み取り/書き込みロック。

セッション210-マスターグランドセントラルディスパッチのWWDC2011セッションビデオにアクセスできる場合は、これについて詳しく知ることができます。

于 2012-04-19T18:52:21.363 に答える
2

また、すべての読み取り/書き込み操作のためにシリアルキューを維持することを検討することもできます。次にdispatch_sync()、そのキューに書き込んで、データモデルへの変更がすぐに適用され、dispatch_async()すべての読み取りがアプリで優れたパフォーマンスを維持していることを確認できます。

すべての読み取りと書き込みが行われる単一のシリアルキューがあるため、書き込み中に読み取りが発生しないようにします。これはロックよりもはるかに安価ですが、複数の「読み取り」操作を同時に実行できないことを意味します。これにより、ほとんどのアプリケーションで問題が発生する可能性はほとんどありません。

を使用dispatch_barrier_async()すると、バリアブロックが実行される前にキュー内の既存のすべてのタスクを完了する必要があるため、実際にコミットされるまでに任意の時間がかかる可能性があります。

于 2012-04-24T08:35:07.530 に答える