同步生产者,消费者和生产者队列

时间:2010-10-09 08:40:26

标签: multithreading cocoa synchronization producer-consumer

我有生产者和消费者。生产者用对象填充其内部队列,消费者逐个获取这些对象。我希望将cosumer与生产者同步,以便消费者在没有准备好对象的情况下阻止,并且我想要将生产者与自身同步,以便在队列满时停止生成(并在有空间时再次启动) 。我怎么做?我能够使用NSConditionalLock在没有队列的情况下解决更简单的情况,但是对于队列,问题看起来更复杂。

2 个答案:

答案 0 :(得分:1)

您可以考虑使用一对NSOperationQueues或调度队列。让生产操作(在生产者队列中)在必要时在主线程上将消息发送到将消费操作添加到消费者队列的对象。

答案 1 :(得分:0)

我最终使用了两个信号量,objectsReadybufferFreeSlots

@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初始化为最大队列大小。到目前为止似乎有效,但上帝知道这是一种信仰行为,而不是一种坚定的信心。