Я знаю и понимаю следующие вещи:
Глобальная очередь - это параллельная очередь, которая может отправлять задачи нескольким потокам. Порядок выполнения задачи не гарантируется. например:.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), {
for (int i; i<10; i++) {
doTask()
}
})
Если я хочу отправить в очередь serial, я могу использовать
dispatch_async(dispatch_queue_create("my.serial.queue", nil) {
...
}
каждый раз только одна задача отправляется в поток и выполняется. Порядок - это FIFO.
===== Что меня смущает и не полностью понимает =======
-
Основной поток имеет NSRunLoop, задачи цикла в основном потоке. Мне интересно, что такое связь между диспетчерской очередью и циклом запуска? Могу ли я это понять, если при отправке задачи в основной поток основной поток NSRunLoop получает отправленную задачу и выполняет ее?
-
Как насчет глобальной очереди, отправляющей задачи на несколько потоков? Система iOS/OSX автоматически создает не только потоки, но также создает NSRunLoop для каждого потока? а затем цикл цикла в каждом потоке получает отправленную задачу из глобальной очереди и выполняет ее?
-
Кто знает эту тему? Вы знаете, что функция
dispatch_async()
иdispatch_sync()
знает, к какому потоку относится задача отправки, или знает ли очередь , какой поток отправляет задачу? -
Есть ли способ получить объект NSRunLoop потока (которому отправлена задача) из очереди отправки программно? (этот вопрос связан с вопросом 3)