我有生产者和消费者。生产者用对象填充其内部队列,消费者逐个获取这些对象。我希望将cosumer与生产者同步,以便消费者在没有准备好对象的情况下阻止,并且我想要将生产者与自身同步,以便在队列满时停止生成(并在有空间时再次启动) 。我怎么做?我能够使用NSConditionalLock
在没有队列的情况下解决更简单的情况,但是对于队列,问题看起来更复杂。
答案 0 :(得分:1)
您可以考虑使用一对NSOperationQueues或调度队列。让生产操作(在生产者队列中)在必要时在主线程上将消息发送到将消费操作添加到消费者队列的对象。
答案 1 :(得分:0)
我最终使用了两个信号量,objectsReady
和bufferFreeSlots
:
@implementation Producer
- (id) getNextObject {
[objectsReady wait];
id anObject = [[buffer objectAtIndex:0] retain];
[buffer removeObjectAtIndex:0];
[bufferFreeSlots signal];
return [anObject autorelease];
}
- (void) decodeLoop {
while (1) {
[bufferFreeSlots wait];
[buffer push:[self produceAnObject]];
[objectsReady signal];
}
}
@end
bufferFreeSlots
初始化为最大队列大小。到目前为止似乎有效,但上帝知道这是一种信仰行为,而不是一种坚定的信心。