La file d'attente principale s'exécute en effet sur le thread principal comme vous le dites.
Les files d'attente globales sont des files d'attente concurrentes et de la page principale de dispatch_get_global_queue :
Contrairement à la file d'attente principale ou dispatch_queue_create(), les files concurrentes globales planifient les blocs dès que des threads sont disponibles (ordre d'achèvement "non-FIFO"). Les files concurrentes globales représentent trois bandes de priorité :
• DISPATCH_QUEUE_PRIORITY_HIGH
• DISPATCH_QUEUE_PRIORITY_DEFAULT
• DISPATCH_QUEUE_PRIORITY_LOW
Les blocs soumis à la file d'attente globale de haute priorité seront invoqués avant ceux soumis à la file d'attente globale par défaut ou de basse priorité. ou à la file d'attente globale de faible priorité. Les blocs soumis à la file d'attente globale de faible priorité ne seront ne seront invoqués que si aucun bloc n'est en attente dans les files d'attente par défaut ou de haute priorité.
Il s'agit donc de files d'attente qui s'exécutent en arrière-plan au fur et à mesure de leur disponibilité. Elles sont "non-FIFO" et l'ordre n'est donc pas garanti.