我有一个生产者和一个消费者。生产者用对象填充其内部队列,消费者一个接一个地获取这些对象。我想让消费者与生产者同步,这样消费者就会在没有准备好的对象时阻塞,我想让生产者与自己同步,这样当队列满了时它就会停止生产(当有空间时,它会重新开始)。我该怎么做?我可以使用NSConditionalLock在没有队列的情况下解决更简单的情况,但是有了队列问题看起来更复杂。
发布于 2010-10-10 00:32:55
我最终使用了两个信号量: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];
}
}
@endbufferFreeSlots被初始化为最大队列大小。到目前为止,它似乎是有效的,但上帝知道这是一种信念的行为,而不是坚实的信心。
发布于 2010-10-10 00:48:34
您可以考虑使用一对NSOperationQueues或分派队列。如果需要,让您的生产操作(在生产者队列中)在主线程上发送消息到一个对象,该对象将消费操作添加到消费者队列中。
https://stackoverflow.com/questions/3896617
复制相似问题