Différence entre dispatch_async et dispatch_sync sur la série de la file d'attente?
J'ai créé une série de file d'attente comme ceci:
dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL);
Quelle est la différence entre dispatch_async
appelle
dispatch_async(_serialQueue, ^{ /* TASK 1 */ });
dispatch_async(_serialQueue, ^{ /* TASK 2 */ });
Et dispatch_sync
appelé comme ça sur cette série de file d'attente?
dispatch_sync(_serialQueue, ^{ /* TASK 1 */ });
dispatch_sync(_serialQueue, ^{ /* TASK 2 */ });
Ma compréhension est que, indépendamment de la méthode dispatch est utilisé, TASK 1
seront exécutées et achevées avant TASK 2
, correct?
Vous devez vous connecter pour publier un commentaire.
Oui. À l'aide de file série d'assurer l'exécution en série de tâches. La seule différence est que
dispatch_sync
seulement de retour après le bloc est terminé alors quedispatch_async
de retour après est ajoutée à la file d'attente et ne peuvent pas fini.pour ce code
Il peut imprimer
2413
ou2143
ou1234
mais1
toujours avant3
pour ce code
il a toujours l'impression
1234
Remarque: Pour le premier code, il ne impression
1324
. Parce queprintf("3")
est distribué aprèsprintf("2")
est exécutée. Et une tâche ne peut être exécutée après il est distribué.Le temps d'exécution des tâches n'a pas changer quoi que ce soit. Ce code toujours l'impression
12
Ce qui peut arrivé est
et vous voyez toujours
12
printf("1");printf("2") ;printf("3") ;printf("4")
- par rapport àdispatch_sync
dispatch_sync(_serialQueue, ^{ /*change shared data*/ });
en même temps.dispatch_sync
?printf("2")
est toujours exécuté avant que le " printf("3"). De sa première ligne de code a frappé lors de la première expédition retours. Sauf si quelqu'un peut expliquer autrement, je suis positif 2 sera imprimé avant le 3dispatch_sync(_serialQueue, ^{ printf(timeConsuimingSomething); });
puisdispatch_sync(_serialQueue, ^{ printf(notTimeConsumingSomething); });
encoretimeConsumingSomething
est imprimé la première à droite? Comment et qu'est-ce qui est holdingnotTimeConsumingSomething
d'être imprimée pour la première fois, while c'est le code est déjà fini avanttimeConsumingSomething
!?dispatch_sync
est appelée sur un même thread, c'est la garantie que les deux tâches seront mis en file d'attente avec l'ordre correct. Puis l'expédition de série de la file d'attente s'assurer que les tâches sont exécutées dans l'ordre correct.sync
situation disons que nous avons étédispatch_sync(_serialQueue, ^{ printf(timeConsuimingSomething); });
puisdispatch_sync(_serialQueue, ^{ printf(notTimeConsumingSomething); });
encoretimeConsumingSomething
est imprimé la première à droite? Comment et qu'est-ce qui est holdingnotTimeConsumingSomething
d'être imprimée pour la première fois, while c'est le code est déjà fini avanttimeConsumingSomething
!? *si possible, pouvez-vous s'il vous plaît ajouter un cas où le passage des éléments très différents de timing, comme ma question?sync
puis attend son exécution, et si sesasync
il n'a pas d'attente pour l'exécution. Vous avez dit numéro de série de l'exécution, ce qui n'est pas le cas asynchrone. La série-ness de de une file série est sur les tâches de la file d'attente depuis sa encore simultanée à d'autres files d'attente.dispatch_barrier_async
comme indiqué ici droit?La différence entre
dispatch_sync
etdispatch_async
est simple.Dans vos deux exemples,
TASK 1
sera toujours exécuté avantTASK 2
parce qu'il a été distribué avant elle.Dans le
dispatch_sync
exemple, cependant, vous n'aurez pas d'expéditionTASK 2
jusqu'à ce que aprèsTASK 1
a été distribué et exécuté. Ceci est appelé "blocage". Votre code attend (ou "blocs") jusqu'à ce que la tâche s'exécute.Dans le
dispatch_async
exemple, votre code ne sera pas attendre, pour que l'exécution complète. Les deux blocs de répartition (et être mis en file d'attente) à la file d'attente et le reste de votre code de poursuivre l'exécution sur ce thread. Puis à un certain moment dans l'avenir, en fonction de ce que le reste a été distribué à votre file d'attente),Task 1
va exécuter puisTask 2
à exécuter.async
qui est le non-blocage de versionC'est tous liés à la file d'attente principale. Il y a 4 permutations.
i) de Série de la file d'attente, envoi asynchrone : Ici, les tâches exécuter l'un après l'autre, mais le thread principal(effet sur l'INTERFACE utilisateur) ne sera pas attendre pour revenir
ii) de Série de la file d'attente, envoi de synchronisation: Ici, les tâches exécuter l'un après l'autre, mais le thread principal(effet sur l'INTERFACE utilisateur) afficher un décalage
iii) Simultanées de la file d'attente, envoi asynchrone : Ici, les tâches s'exécutent en parallèle et le thread principal(effet sur l'INTERFACE utilisateur ) ne sera pas attendre pour le retour et sera lisse.
iv) Simultanées de la file d'attente, envoi de synchronisation : Ici, les tâches s'exécutent en parallèle, mais le thread principal(effet sur l'INTERFACE utilisateur) afficher un décalage
De votre choix en parallèle ou en série de la file d'attente dépend de si vous avez besoin d'une sortie à partir d'une tâche précédente pour le prochain. Si vous dépendez de la tâche précédente, adopter le numéro de série de la file d'attente d'autre prendre simultanées de la file d'attente.
Et enfin c'est une façon de pénétrer au thread principal lorsque nous avons terminé avec notre entreprise :