1

キューを実装する必要があり(によって実行されるNSMutableArray)、Producerキューにデータを追加するオブジェクトがある場合。1つのプロデューサーまたは複数のプロデューサーが存在する可能性があります。また、キューがいっぱいの場合(たとえば、サイズが100の場合)、スレッドを「ブロック」する必要があります(キューが実際に100アイテムよりも小さいサイズになるまで待機します)。(キューからデータを取り出す場合も同様です。データが空の場合、データの取得もブロックされます)。

この「ブロッキング」はどのように実装できますか?今はMutexを使っています

@property (strong, atomic) NSLock *lock;

NSMutableArrayのカウントが取得され、アイテムの追加が一緒に行われるようにします(カウントは99になる可能性がありますが、アイテムが追加されると、カウントはすでに異なる可能性があるため)。

しかし、ブロッキング効果については、実際にカウントを確認し、100の場合は、ロックを解除して0.1秒間スリープしてから、もう一度ロックを取得してカウントを取得し、上記のように繰り返します。

これは「ブロッキング」動作を実装するための良い方法ですか?canAddNowLockメカニズムによって単純にブロックされているを取得する別の方法があるようですNSLock。キューアイテムが削除されたら、これを解放しますcanAddNowLockが、複数のデータプロデューサーとデータコンシューマーが存在する可能性があるため、複数のプロデューサーがブロック解除された場合、または複数のコンシューマーcanAddNowLockが連続してロックを解除し、1つのプロデューサーのみがブロック解除された場合(実際には複数のプロデューサーがブロック解除されるべきである場合)はどうなりますか?そうすれば、もっと複雑なデザインのように見えます。

4

1 に答える 1

1

NSCondition * condition thread1を使用します:

[condition lock];
//check the queue is not full
[condition wait];//if already full, wait
//check again
//put something into queue
[condition unlock];

スレッド2:

[condition lock];
//check the queue is not empty
//get something from queue
[condition signal];
[condition unlock];
于 2012-08-24T01:36:50.517 に答える