NSCondition. , , NSCondition , .
NSCondition docs:
. , , . , , . , .
- ...
BOOL ( NO), , , NSCondition. dispatch_async , .
, NSCondition, BOOL, , . , . , wait a signal NSCondition , . , unlock NSCondition.
, NSCondition . , BOOL, , . signal unlock NSCondition.
. , BOOL, , , outputFrame NSCondition; , .
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t writeQueue = dispatch_queue_create("writeQueue", DISPATCH_QUEUE_SERIAL);
while (true) {
NSCondition *condition = [[NSCondition alloc] init];
__block BOOL frameProcessed = NO;
__block FrameType outputFrame = nil;
dispatch_async(backgroundQueue, ^{
[condition lock];
processVideo(frame, outputFrame);
frameProcessed = YES;
[condition signal];
[condition unlock];
});
dispatch_async(writeQueue, ^{
[condition lock];
while (!frameProcessed) {
[condition wait];
}
writeToVideo(outputFrame);
[condition unlock];
});
}
: BOOL frameProcessed. , , .
: NSCondition .
, , .
, NSCondition, , writeQueue , . NSCondition, ; int, , .
readCondition, writeQueueSize maxWriteQueueSize. lock readCondition, , writeQueueSize >= maxWriteQueueSize. , . writeQueue, increment writeQueueSize. unlock readCondition.
, writeQueue, , lock readCondition, writeQueueSize signal unlock readCondition.
, writeQueue maxWriteQueueSize . , , writeQueue .
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t writeQueue = dispatch_queue_create("writeQueue", DISPATCH_QUEUE_SERIAL);
NSCondition *readCondition = [[NSCondition alloc] init];
__block int writeQueueSize = 0;
const int maxWriteQueueSize = 10;
while (true) {
NSCondition *writeCondition = [[NSCondition alloc] init];
__block BOOL frameProcessed = NO;
__block FrameType outputFrame = nil;
[readCondition lock];
while (writeQueueSize >= maxWriteQueueSize) {
[readCondition wait];
}
dispatch_async(backgroundQueue, ^{
[writeCondition lock];
processVideo(frame, outputFrame);
frameProcessed = YES;
[writeCondition signal];
[writeCondition unlock];
});
writeQueueSize++;
dispatch_async(writeQueue, ^{
[writeCondition lock];
while (!frameProcessed) {
[writeCondition wait];
}
writeToVideo(outputFrame);
[writeCondition unlock];
[readCondition lock];
writeQueueSize--;
[readCondition signal];
[readCondition unlock];
});
[readCondition unlock];
}