2

私はAppleのドキュメントConcurrentProgrammingGuideを読んでいて、OperationQueueは一連の操作だと思います。ドキュメントには、ほとんどの場合、NSOperationQueueでロックを使用しないと記載されています。

質問

  1. NSOperationQueueを使用して読み取りと書き込みのタスクを実装するにはどうすればよいですか?

  2. NSOperationQueueでロックを使用するのはいつですか?

4

1 に答える 1

10

オペレーション キューは必ずしもシリアル キューではありません。オペレーション キューを呼び出し[queue setMaxConcurrentOperationCount:1]てシリアル キューにすることができます。それ以外の場合、デフォルトでは、NSOperationQueues は並行です。

通常、ロックを必要としないように、キューに送信する操作を設計する必要があります。それはあなたの責任です。操作は自己完結型でなければならないという考えです。実行するために送信する前に、操作に必要なデータで構成する必要があります。そのデータはプライベート コピーである必要があります。他のものがアクセスしているのと同時に操作がアクセスしているものであってはなりません。操作の実行中は、そのプライベート データのみを操作し、プログラムの他の部分にはアクセスしないでください。操作が完了すると、その結果がプログラムの残りの部分で利用できるようになります。(これは、その結果を独自のプロパティの 1 つに格納するだけで、受動的である可能性があります。その後、操作の完了を観察した可能性のあるプログラムの他の部分がそれを読み取ることができます。

NSOperationQueue読み書きロックはサポートしていません。pthread_rwlockそのために API を使用できます。しかし、もう 1 つの方法は、バリア タスクで GCD ディスパッチ キューを使用することです。を使用してプライベート同時キューを作成しますdispatch_queue_create()。で読み取りタスクを送信しdispatch_[a]sync()ます。を使用して書き込みタスクを送信しdispatch_barrier_[a]sync()ます。

于 2012-05-23T13:32:56.993 に答える