美文网首页
多线程 死锁 , dispatch_barrier_async和

多线程 死锁 , dispatch_barrier_async和

作者: maoege | 来源:发表于2016-11-02 18:23 被阅读0次

    为了深刻理解死锁和栅栏我写了如下两段程序,这两段程序的结果分别如何勒

    dispatch_queue_t queue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_SERIAL);

        dispatch_async(queue, ^{

        dispatch_async(queue, ^{

                NSLog(@"任务0");

            });

            dispatch_barrier_async(queue, ^{

                NSLog(@"任务1");

            });

            dispatch_async(queue, ^{

                NSLog(@"任务2");

            });

            NSLog(@"任务3");

        });

        dispatch_async(queue, ^{

            dispatch_barrier_sync(queue, ^{

                NSLog(@"任务4");

            });

            dispatch_async(queue, ^{

                NSLog(@"任务5");

            });

            NSLog(@"任务6");

        });

    2018-03-05 19:01:29.962166+0800 Demo[80986:6088486] 任务3

    2018-03-05 19:01:29.962375+0800 Demo[80986:6088486] 任务0

    2018-03-05 19:01:29.962483+0800 Demo[80986:6088486] 任务1

    2018-03-05 19:01:29.962720+0800 Demo[80986:6088486] 任务2

    运行起来可以看到第一段程序打印的是3 ,0,1, 2,第二段程序crash了,为什么会产生这样的结果勒

    首先说下为什么会crash ,因为我定义的queue是串形队列,主要问题出在  dispatch_barrier_sync(queue, ^{  })会把block中的任务添加到queue的队列的尾部,而我外面包的 dispatch_async(queue, ^{  })block就是在这个queue中执行的,所以block的内容会在任务6执行完了才会执行,而sync又会把当前队列给堵塞住,所以crash了,跟这段代码一样     dispatch_sync(dispatch_get_main_queue(), ^{    });,主线程也是串形队列,所以crash。

    那么第一段程序中为什么一定是3012,这是因为我外面包的一层block是queue中执行,所以后面的block都会在任务3之后执行,由于栅栏的作用,后面三个的顺序一定是012,所以最后的结果就是3012.

    相关文章

      网友评论

          本文标题:多线程 死锁 , dispatch_barrier_async和

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