Yes. Using serial queue ensure the serial execution of tasks. The only difference is that dispatch_sync
only return after the block is finished whereas dispatch_async
return after it is added to the queue and may not finished.
for this code
dispatch_async(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_async(_serialQueue, ^{ printf("3"); });
printf("4");
It may print 2413
or 2143
or 1234
but 1
always before 3
for this code
dispatch_sync(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_sync(_serialQueue, ^{ printf("3"); });
printf("4");
it always print 1234
Note: For first code, it won't print 1324
. Because printf("3")
is dispatched after printf("2")
is executed. And a task can only be executed after it is dispatched.
The execution time of the tasks doesn't change anything. This code always print 12
dispatch_async(_serialQueue, ^{ sleep(1000);printf("1"); });
dispatch_async(_serialQueue, ^{ printf("2"); });
What may happened is
- Thread 1: dispatch_async a time consuming task (task 1) to serial queue
- Thread 2: start executing task 1
- Thread 1: dispatch_async another task (task 2) to serial queue
- Thread 2: task 1 finished. start executing task 2
- Thread 2: task 2 finished.
and you always see 12
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…