отличный алгоритм.
в основном разделить работу на более мелкие куски (потоки) и объединить результат в конце.
как таковые семафоры не ждут.
изменение его на dispatch_semaphore_create (0) действительно помогает с ожиданием,
однако в моем SL-компьютере GCD, похоже, возвращается к глубокому, то есть: я могу получить более 500 рабочих потоков. в этот момент код просто зависает.
с меньшим подмножеством данных, он прекрасно работает.
...
еще одна вещь.
похоже, есть еще одна проблема с памятью, по крайней мере, на моем модифицированном примере
решение, добавьте сохранение в dispatch_async ()
и затем соответствующий выпуск после dispatch_semaphore_wait ()
// Create semaphore and sort the left side
__block NSArray* lessSorted = nil;
dispatch_semaphore_t lessSem = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
lessSorted = [QuickSort sort:less useGCD:useGCD];
[lessSorted retain];
dispatch_semaphore_signal(lessSem);
});
// Create semaphore and sort the right side
__block NSArray* moreSorted = nil;
dispatch_semaphore_t moreSem = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
moreSorted = [QuickSort sort:more useGCD:useGCD];
[moreSorted retain];
dispatch_semaphore_signal(moreSem);
});
// Wait for both sides to finish sorting
dispatch_semaphore_wait(lessSem, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(moreSem, DISPATCH_TIME_FOREVER);
// Merge
[concat addObjectsFromArray:lessSorted];
[concat addObject:pivotObj];
[concat addObjectsFromArray:moreSorted];
dispatch_release(lessSem);
dispatch_release(moreSem);
[lessSorted release];
[less release];
[moreSorted release];
[more release];