4

私は Macruby でこれを行っていますが、ここではそれほど重要ではないと思います。

状態を辞書データ構造に格納するモデルがあります。同時操作でこのデータ構造を散発的に更新したいと考えています。GCDは、これら2つを含む、これに対するいくつかの可能な解決策を提供しているように私には思えます:

  • 何らかのシリアル キューに送信されるブロック内のデータ構造にアクセスするコードをラップする
  • 構造体にアクセスするときに必要に応じて待機/シグナル呼び出しを送信するクライアント コードで、GCD セマフォを使用する

最初のソリューションのキューが同期的に呼び出されると、セマフォ ソリューションとほとんど同じように見えます。これらのソリューションのいずれにも、私が見逃している明確な利点がありますか? 私が見逃しているより良い代替手段はありますか?

また、GCD で読み取り/書き込み (共有排他) ロックを実装するのは簡単ですか?

4

3 に答える 3

0

以前の回答に警告を追加します(ディスパッチキューの詐欺になります)。

ディスパッチ キューがどのように呼び出されるかに注意する必要があります。これは、実際に遭遇するまですぐにはわからなかった隠れたシナリオがいくつかあるためです。

多数のクリティカル セクションの NSLock と @synchronized をディスパッチ キューに置き換えて、軽量な同期を実現しました。残念ながら、デッドロックが発生する状況に遭遇したため、dispatch_barrier_async / dispatch_sync パターンの使用に戻しました。並行キューを作成した場合でも、dispatch_sync は日和見的にメイン キューでそのブロックを呼び出す可能性があります (既にそこで実行されている場合)。現在のディスパッチ キューの dispatch_sync がデッドロックを引き起こすため、これは問題です。

私は後退して、これらの領域で別のロック技術を使用すると思います。

于 2015-10-08T04:54:58.673 に答える
0

シリアル キューを使用してデータ構造へのアクセスを保護することは、dispatch_sync意味的にはディスパッチ セマフォを使用することと同等であり、競合しない場合は、両方とも非常に高速である必要があります。パフォーマンスが重要な場合は、ベンチマークを行い、大きな違いがあるかどうかを確認してください。

リーダー/ライター ロックに関しては、実際に GCD の上に構築することができます。(警告: ドラゴン/十分にテストされていないコードがあります。) 私のソリューションは、グローバルな同時実行キューに送信する前に、中間のシリアル キューを介して読み取り/書き込み要求を集中させます。書き込み要求が連続して実行されるように、シリアル キューは適切なタイミングで一時停止/再開されます。

同期ポイントを許可するプライベートな同時ディスパッチ キューをシミュレートする何かが必要でした。これは、パブリック GCD API では公開されていませんが、将来的に強く示唆されているものです。

于 2011-05-06T11:49:16.183 に答える
0

シリアル キュー

  • 長所
    • ロックはありません
  • 短所
    • タスクはシリアル キューで同時に動作できません

GCD セマフォ

  • 長所
    • タスクは同時に実行できます
  • 短所
    • 軽量なのにロックを採用

また、GCD セマフォの代わりにアトミック操作を使用することもできます。状況によっては、GCD セマフォよりも軽量になります。

同期ツール - アトミック操作

于 2011-02-27T22:00:46.947 に答える