美文网首页
面试的时候给自己挖坑(线程)

面试的时候给自己挖坑(线程)

作者: 游城十代2dai | 来源:发表于2020-05-21 16:12 被阅读0次

面试官给我的第一个问题就是:

一个主线程任务等待另外两个子线程任务执行完成

我打开 Xcode, 由于视频面试共享桌面, 我怕运行 iOS 模拟器会卡, 所以选择了 Command Line Tool, 此时就挖坑了, 代码如下两种方式


void test1(void) {
    
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_group_async(group, queue, ^{
        sleep(1);
        NSLog(@"print 1: %@", [NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
        sleep(1);
        NSLog(@"print 2: %@", [NSThread currentThread]);
    });
    
   dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"print 3: %@", [NSThread currentThread]);
    });

}


void test2(void) {
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_semaphore_t signal = dispatch_semaphore_create(1);
    
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"print 1: %@", [NSThread currentThread]);
        dispatch_semaphore_signal(signal);
    });
    dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
    
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"print 2: %@", [NSThread currentThread]);
        dispatch_semaphore_signal(signal);
    });
    dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
    
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"print 3");
    });
}

上面的代码在 iOS APP 上执行的顺序是 1,2 先执行顺序不固定, 然后再执行 3
上面的代码在 Command Line 上执行的顺序是 1,2 执行顺序不固定, 然后结束, 这个打印不绝对, 因为都是异步执行很有可能一个打印都没有就结束了

为什么这样呢?

因为 Command Line 没有 Runloop, 也就是运行完即销毁了, 等不到异步任务结束

所以在 main 函数底部或者 test 函数底部添加如下代码即可:

[NSRunLoop.currentRunLoop addPort:NSPort.new forMode:NSDefaultRunLoopMode];
[NSRunLoop.currentRunLoop run];

借此机会改编一下我遇到的问题, 生成如下面试题:

// 在 Command Line Tool 中下面的代码打印顺序大该怎样, 并说出线程大概什么样子
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        dispatch_group_t group = dispatch_group_create();
        dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_queue_t queue2 = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
        
        dispatch_group_async(group, queue, ^{
            sleep(1);
            NSLog(@"print 1: %@", [NSThread currentThread]);
        });
        dispatch_group_async(group, queue, ^{
            sleep(1);
            NSLog(@"print 2: %@", [NSThread currentThread]);
        });
        
        dispatch_group_async(group, queue2, ^{
            sleep(1);
            NSLog(@"print 3: %@", [NSThread currentThread]);
        });
        dispatch_group_async(group, queue2, ^{
            sleep(1);
            NSLog(@"print 4: %@", [NSThread currentThread]);
        });
        
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            NSLog(@"print 5: %@", [NSThread currentThread]);
        });

    }
    return 0;
}

结果就是:

  • 有可能什么都不执行就结束了
  • 有可能执行了, 但是只执行了异步的, 也就是 123 会先执行但是顺序不一定, 4 一定是在 3 之后执行但不一定挨着。 queue 是并行队列, queue2 是串行的, 但是对于 queue 而言, queue2 也是并发的,所以 1、2 、3 顺序不确定, 3 执行后执行4。
  • 线程方面, 5 一定主线程,3、4 同一个线程(串行),1、2 一定不是同一个线程(异步并行)

相关文章

  • 面试的时候给自己挖坑(线程)

    面试官给我的第一个问题就是: 一个主线程任务等待另外两个子线程任务执行完成 我打开 Xcode, 由于视频面试共享...

  • 给自己挖坑

    需求: 一个列表页获取数据方式发生改变,由原来调用“A接口-B接口”的方式,调整为直接调用B接口。 测试点: 1、...

  • 给自己“挖坑”

    开了个简书帐号,日更月更年更,一日不辍。尽量不写水文,也尽量不无效互动,赞可赞,写能写,心口守一。不觉已近二十万字...

  • 自己给自己挖坑

    元旦三天假,归来又考试。领导的安排,只能执行。于是放假前,几个语文老师辛辛苦苦的选题命题,商量假期布置什...

  • 面试

    明知对方说的不是真的却仍然给予机会,比如面试。 有时候不能太坦诚相待,要不然就是给自己挖坑。 合理避开缺点,适当夸...

  • 面试,切忌自己挖坑!

    1、外在形象:如果你是面试官,一个衣着光鲜亮丽,形象气质佳,一个邋遢,不修边幅,你会怎么打分呢?记住,第一印象很重...

  • 给自己挖坑的人

    这段时间事情很多,工作的,家庭的,包括学习的。 早上,一位师兄发信息给我,说可以参加门店特训营,还给我截屏看了课程...

  • 【面试干货十一】公考面试中那些你必须避开的雷区有哪些?

    图 网络 文 沁蓝 这是面试干货系列的第十一篇文章。 雷区一 自己给自己挖坑 坑之一:不断地否定自己 “我想,如...

  • 常见的五种离职原因,换个角度去表述会更有说服力

    找工作面试,经常会被面试官问及离职原因,如何将其回答好,而不给自己挖坑,确实有些难度。 常见的原因无非就两种:钱给...

  • 如何逼自己成为一个上进的人?

    不断给自己挖坑,是使自己不断成长的一种途径。「给自己挖坑」这个说法是从罗胖《知识就是力量》节目听到的,他自己介绍,...

网友评论

      本文标题:面试的时候给自己挖坑(线程)

      本文链接:https://www.haomeiwen.com/subject/tigzohtx.html