0

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

4

2 回答 2

1

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

于 2010-10-09T16:48:34.327 回答
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初始化为最大队列大小。到目前为止,它似乎奏效了,但上帝知道这是一种信心的表现,而不是坚定的信心。

于 2010-10-09T16:32:55.143 回答