У меня есть производитель и потребитель. Производитель заполняет свою внутреннюю очередь объектами, потребитель принимает эти объекты один за другим. Я хочу синхронизировать cosumer с производителем, чтобы потребитель блокировался, когда нет готовых объектов, и я хочу синхронизировать производителя с самим собой, чтобы он прекращал производство, когда очередь заполнена (и запускалась снова, когда есть место) . Как я могу это сделать? Я смог решить более простой случай без очереди, используя NSConditionalLock
, но с очередью проблема выглядит более сложной.
2 ответа
В итоге я использовал два семафора, 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
инициализируется максимальным размером очереди. Пока что вроде работает, но Бог знает, что это акт веры, а не твердой уверенности.
Вы можете рассмотреть возможность использования пары NSOperationQueues или очередей отправки. Попросите ваши производственные операции (в очереди производителя) отправлять сообщения в основном потоке, если это необходимо, объекту, который добавляет операции потребления в очередь потребителя.
Похожие вопросы
Связанные вопросы
Новые вопросы
multithreading
Для вопросов, касающихся многопоточности, способность компьютера или программы выполнять работу одновременно или асинхронно, используя несколько одновременных потоков выполнения (обычно называемых потоками).
operationCount
очереди потребителей и приостанавливать очередь производителя, когда она становится слишком высокой, и отменять ее, когда она возвращается к удобному уровню.