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