Синхронизация производителя, потребителя и очереди производителя - PullRequest
0 голосов
/ 09 октября 2010

У меня есть производитель и потребитель. Производитель заполняет свою внутреннюю очередь объектами, а потребитель получает эти объекты один за другим. Я хочу синхронизировать cosumer с производителем, чтобы потребитель блокировал, когда нет готовых объектов, и я хочу синхронизировать производителя с самим собой, чтобы он прекратил производство, когда очередь заполнена (и запускается снова, когда есть место) , Как я могу это сделать? Мне удалось решить более простой случай без очереди, используя NSConditionalLock, но с этой задачей проблема выглядит более сложной.

Ответы [ 2 ]

1 голос
/ 09 октября 2010

Вы можете рассмотреть возможность использования пары NSOperationQueues или очередей отправки. Ваши производственные операции (в очереди производителей) отправляют сообщения в главном потоке, если необходимо, объекту, который добавляет операции потребления в очередь потребителей.

0 голосов
/ 09 октября 2010

Я использовал два семафора, 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 инициализируется до максимального размера очередиПока что это работает, но Бог знает, что это акт веры, а не уверенность в себе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...