我创建了一个像这样的串行队列:
dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL);
有什么区别dispatch_async
像这样称呼
dispatch_async(_serialQueue, ^{ /* TASK 1 */ });
dispatch_async(_serialQueue, ^{ /* TASK 2 */ });
And dispatch_sync
在这个串行队列上这样调用?
dispatch_sync(_serialQueue, ^{ /* TASK 1 */ });
dispatch_sync(_serialQueue, ^{ /* TASK 2 */ });
我的理解是,无论使用哪种调度方法,TASK 1
将在之前执行并完成TASK 2
, 正确的?
是的。使用串行队列保证任务的串行执行。唯一的区别是dispatch_sync
仅在块完成后返回,而dispatch_async
添加到队列后返回,并且可能未完成。
对于这段代码
dispatch_async(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_async(_serialQueue, ^{ printf("3"); });
printf("4");
可能会打印2413
or 2143
or 1234
but 1
总是在之前3
对于这段代码
dispatch_sync(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_sync(_serialQueue, ^{ printf("3"); });
printf("4");
它总是打印1234
注意:对于第一个代码,它won't print 1324
。因为printf("3")
已派遣after printf("2")
被执行。并且一个任务只能被执行after已发送。
任务的执行时间不会改变任何东西。此代码始终打印12
dispatch_async(_serialQueue, ^{ sleep(1000);printf("1"); });
dispatch_async(_serialQueue, ^{ printf("2"); });
可能发生的情况是
- 线程1:dispatch_async一个耗时任务(任务1)到串行队列
- 线程2:开始执行任务1
- 线程1:dispatch_async另一个任务(任务2)到串行队列
- 线程 2:任务 1 完成。开始执行任务2
- 线程 2:任务 2 完成。
你总是看到12
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)