多线程理解实践

1.微博面试题 

    dispatch_queue_t queue = dispatch_queue_create("com.lg.cooci.cn", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{ // 耗时
        NSLog(@"1");
    });
    dispatch_async(queue, ^{
        NSLog(@"2");
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"3");
    });
    
    NSLog(@"0");

    dispatch_async(queue, ^{
        NSLog(@"7");
    });
    dispatch_async(queue, ^{
        NSLog(@"8");
    });
    dispatch_async(queue, ^{
        NSLog(@"9");
    });

// A: 1230789
// B: 1237890
// C: 3120798
// D: 2137890

结果:A或者C

分析:123顺序不定,  0 肯定在3后面 ,789 顺序不定, 肯定在0后面

2.快手面试题

    dispatch_queue_t queue = dispatch_queue_create("cooci", NULL);
    NSLog(@"1");
    // 异步函数
    dispatch_async(queue, ^{
        NSLog(@"2");
        // 同步
        dispatch_sync(queue, ^{
            NSLog(@"3");
        });
    });
    NSLog(@"5");

结果:打印 1 5 2 然后  dispatch_sync(queue 这一行死锁

分析:主线程 打印 1 5, dispatch_async(queue 新开辟一个子线程,子线程 打印 2,串行队列必须执行完一个任务再执行另一个。串行队列执行同步函数,然后同步函数又要获得串行队列去做其他事,形成死锁。

在北京的灯中,有一盏是我家的。这个梦何时可以实现?哪怕微微亮。北京就像魔鬼训练营,有能力的留,没能力的走……
原文地址:https://www.cnblogs.com/huangzs/p/14831910.html