zoukankan      html  css  js  c++  java
  • 《iOS面试之道》-“串行队列的代码实战” 勘误

    一、原书第一版154页开始讲解串行队列、并发队列、以及在Dispatch_Async、Dispatch_Sync下面的作用

      最后一段代码:

        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中

        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谁先执行,需要看线程切换的顺序,不能够确定。

      

  • 相关阅读:
    一次http请求,谁会先断开TCP连接?什么情况下客户端先断,什么情况下服务端先断?
    nginx.conf详解
    50:树中两个结点的最低公共祖先
    49:把字符串转换为整数
    48:不能被继承的类
    47:不用加减乘除做加法
    46:求1+2+...+n
    45:圆圈中最后剩下的数字
    44:扑克牌顺子
    43:n个骰子的点数
  • 原文地址:https://www.cnblogs.com/doudouyoutang/p/9763677.html
Copyright © 2011-2022 走看看