《iOS面试之道》-“串行队列的代码实战” 勘误
一、原书第一版154页开始讲解串行队列、并发队列、以及在Dispatch_Async、Dispatch_Sync下面的作用
最后一段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | if (_q == NULL ) { _q = dispatch_queue_create( "SerialQueue" , DISPATCH_QUEUE_SERIAL); } NSMutableString *str = [[ NSMutableString alloc] init]; [str appendString:@ "1" ]; dispatch_sync(_q, ^{ [str appendString:@ "2" ]; dispatch_async(_q, ^{ [str appendString:@ "3" ]; }); [str appendString:@ "4" ]; }); [str appendString:@ "5" ]; NSLog (@ "%@" , str); |
代码如上面,最后输出的数字代表执行顺序。书中最后说顺序会输出两个结果,12345、12435、3一定会在4之前被打印出来
下图的顶部
看到这里觉得有些不对,写了代码试了一下,3是绝对不会出现在4之前的。即使在4之前加上延时,也不会
新建App工程,将下面的代码放在ViewDidload中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | if (_q == NULL ) { _q = dispatch_queue_create( "SerialQueue" , DISPATCH_QUEUE_SERIAL); } NSMutableString *str = [[ NSMutableString alloc] init]; [str appendString:@ "1" ]; dispatch_sync(_q, ^{ [str appendString:@ "2" ]; dispatch_async(_q, ^{ [str appendString:@ "3" ]; }); [ NSThread sleepForTimeInterval:10]; [str appendString:@ "4" ]; }); [str appendString:@ "5" ]; NSLog (@ "%@" , str); |
加上10s延时,输出12453.
原书的结论错误。
正确的结果是,出现12453或者12435,24一定出现在3之前。
因为首先Dispatch_Sync表示将一个block入队列,并且等待该队列执行完毕,所以先输出12
Dispatch_Async表示将一个block入队列,立即返回,因为入的是串行队列所以不能并发执行,需要等待队列中之前的任务执行完毕,所以3一定在4之后才能执行
3和5谁先执行,需要看线程切换的顺序,不能够确定。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架