Я пишу свои первые многопоточные приложения для iPhone, используя NSOperationQueue, потому что я слышал, что он загружается лучше и потенциально быстрее, чем управление собственной потоковой диспетчеризацией.
Я вычисляю результат платы Game of Life, разбивая доску на отдельные части и имея отдельные потоки, рассчитываю каждую доску, а затем склеиваю их обратно, для меня это кажется более быстрым способом, даже с огромными накладными расходами расщепление и сплайсинг. Я создаю объект NSInvocationOperation для каждой доски и затем отправляю их в OperationQueue. После того, как я отправил все куски доски, я сижу и жду, пока они все закончат вычисления с помощью вызова waitUntilAllOperationsAreFinished к OperationQueue.
Кажется, что это должно работать, и это работает нормально. НО потоки вызываются очень slooooowwwlllyyyyyy, и поэтому многопоточная версия вычисляется дольше, чем однопоточная версия! ОН НЕТ! Я следил за созданием и завершением NSOperations, отправленных в NSOperationQueue, и обнаружил, что некоторые просто сидят в очереди операций do-diddly-daddlin некоторое время, прежде чем их вызовут намного позже. Сначала я подумал: «Эй, может быть, очередь может обрабатывать только столько потоков одновременно?», А затем поднял значение Queues maxConcurrentOperationCount до произвольно большого числа (намного больше, чем количество плат), но я испытал то же самое!
Мне было интересно, может, кто-нибудь подскажет мне, как включить NSOperationQueue в «перегрузку», так сказать, чтобы он как можно быстрее отправлял свои очереди, или это, или скажите мне, что происходит!