Si. El uso de la cola en serie garantiza la ejecución en serie de las tareas. La única diferencia es que dispatch_syncsolo regresa después de que el bloque ha finalizado, mientras que dispatch_asyncregresa después de que se agrega a la cola y puede que no finalice.
Nota: Para el primer código, no se imprimirá 1324. Porque printf("3")se despacha después de queprintf("2") se ejecuta. Y una tarea solo se puede ejecutar después de que se envíe.
El tiempo de ejecución de las tareas no cambia nada. Este código siempre se imprime12
mi pregunta es ¿por qué no lo hicimos de la manera normal? printf("1");printf("2") ;printf("3") ;printf("4")- en comparación condispatch_sync
androniennn
@androniennn para el segundo ejemplo? porque algún otro hilo puede ejecutarse dispatch_sync(_serialQueue, ^{ /*change shared data*/ });al mismo tiempo.
Bryan Chen
1
@ asma22 Es muy útil compartir un objeto no seguro para subprocesos entre múltiples subprocesos / colas de despacho. Si solo accede al objeto en una cola en serie, sabe que está accediendo a él de manera segura.
Bryan Chen
1
Me refiero a la ejecución en serie . En el punto de vista de que todas las tareas se ejecutan en serie con respecto a otras tareas en la misma cola. Por causa aún puede ser concurrente respecto a otras colas. El objetivo de GCD es que las tareas se puedan despachar y ejecutar simultáneamente.
Bryan Chen
19
La diferencia entre dispatch_syncy dispatch_asynces simple.
En ambos ejemplos, TASK 1siempre se ejecutará antes TASK 2porque se envió antes.
En el dispatch_syncejemplo, sin embargo, no enviará TASK 2hasta que TASK 1haya sido despachado y ejecutado . Esto se llama "bloqueo" . Su código espera (o "bloquea") hasta que se ejecuta la tarea.
En el dispatch_asyncejemplo, su código no esperará a que se complete la ejecución. Ambos bloques se enviarán (y se colocarán en cola) a la cola y el resto de su código continuará ejecutándose en ese hilo. Luego, en algún momento en el futuro, (dependiendo de qué más se haya enviado a su cola), Task 1se ejecutará y luego Task 2se ejecutará.
Creo que te equivocaste de orden. primer ejemplo es asynccuál es la versión sin bloqueo
Bryan Chen
He editado tu respuesta a lo que creo que querías decir . Si este no es el caso, cámbielo y aclare.
JRG-Developer
1
¿Qué sucede si llama a dispatch_sync y luego dispatch_async en la misma cola? (y viceversa)
0xSina
1
En una cola en serie, ambas tareas aún se ejecutan una tras otra. En el primer caso, la persona que llama espera a que termine el primer bloque pero no espera el segundo bloque. En el segundo caso, la persona que llama no espera a que termine el primer bloque, sino que espera el segundo bloque. Pero como la cola ejecuta los bloques en orden, la persona que llama efectivamente espera a que ambos terminen.
gnasher729
1
Un bloque también podría hacer un dispatch_async en su propia cola (agregando más bloques que se ejecutarán más adelante); dispatch_sync en la propia cola en serie o en la cola principal se estancaría. En esta situación, la persona que llama esperará a que termine el bloque original, pero no a los otros bloques. Solo recuerde: dispatch_sync coloca el bloque al final de la cola, la cola ejecuta el código hasta que finaliza ese bloque y luego dispatch_sync regresa. dispatch_async simplemente agrega el bloque al final de la cola.
gnasher729
5
Todo está relacionado con la cola principal. Hay 4 permutaciones.
i) Cola de serie, despacho asíncrono: aquí las tareas se ejecutarán una tras otra, pero el hilo principal (efecto en la interfaz de usuario) no esperará el regreso
ii) Cola de serie, sincronización de despacho: aquí las tareas se ejecutarán una tras otra, pero el hilo principal (efecto en la interfaz de usuario) mostrará un retraso
iii) Cola concurrente, despacho asíncrono: aquí las tareas se ejecutarán en paralelo y el hilo principal (efecto en la interfaz de usuario) no esperará el regreso y será fluido.
iv) Cola concurrente, sincronización de despacho: aquí las tareas se ejecutarán en paralelo, pero el hilo principal (efecto en la interfaz de usuario) mostrará un retraso
Su elección de la cola concurrente o en serie depende de si necesita un resultado de una tarea anterior para la siguiente. Si depende de la tarea anterior, adopte la cola en serie o tome cola concurrente.
Y, por último, esta es una forma de volver al hilo principal cuando hayamos terminado con nuestro negocio:
printf("1");printf("2") ;printf("3") ;printf("4")
- en comparación condispatch_sync
dispatch_sync(_serialQueue, ^{ /*change shared data*/ });
al mismo tiempo.La diferencia entre
dispatch_sync
ydispatch_async
es simple.En ambos ejemplos,
TASK 1
siempre se ejecutará antesTASK 2
porque se envió antes.En el
dispatch_sync
ejemplo, sin embargo, no enviaráTASK 2
hasta queTASK 1
haya sido despachado y ejecutado . Esto se llama "bloqueo" . Su código espera (o "bloquea") hasta que se ejecuta la tarea.En el
dispatch_async
ejemplo, su código no esperará a que se complete la ejecución. Ambos bloques se enviarán (y se colocarán en cola) a la cola y el resto de su código continuará ejecutándose en ese hilo. Luego, en algún momento en el futuro, (dependiendo de qué más se haya enviado a su cola),Task 1
se ejecutará y luegoTask 2
se ejecutará.fuente
async
cuál es la versión sin bloqueoTodo está relacionado con la cola principal. Hay 4 permutaciones.
i) Cola de serie, despacho asíncrono: aquí las tareas se ejecutarán una tras otra, pero el hilo principal (efecto en la interfaz de usuario) no esperará el regreso
ii) Cola de serie, sincronización de despacho: aquí las tareas se ejecutarán una tras otra, pero el hilo principal (efecto en la interfaz de usuario) mostrará un retraso
iii) Cola concurrente, despacho asíncrono: aquí las tareas se ejecutarán en paralelo y el hilo principal (efecto en la interfaz de usuario) no esperará el regreso y será fluido.
iv) Cola concurrente, sincronización de despacho: aquí las tareas se ejecutarán en paralelo, pero el hilo principal (efecto en la interfaz de usuario) mostrará un retraso
Su elección de la cola concurrente o en serie depende de si necesita un resultado de una tarea anterior para la siguiente. Si depende de la tarea anterior, adopte la cola en serie o tome cola concurrente.
Y, por último, esta es una forma de volver al hilo principal cuando hayamos terminado con nuestro negocio:
fuente