新浦京81707con > 软件下载 > 新京葡娱乐场官网死锁原因

原标题:新京葡娱乐场官网死锁原因

浏览次数:88 时间:2020-04-28

GCD死锁概念:

应用GCD四线程编制程序时,如果同步函数dispatch_sync(State of Qatar,指标queue为当前queue,且queue为串行队列时,由于线程相互等待,会促成死锁,引致程序奔溃。

主线程运行如下代码:奔溃 dispatch_sync(dispatch_get_main_queue(), ^{ NSLog; });或者:// 串行队列dispatch_queue_t queue = dispatch_queue_create("test.concurrent", DISPATCH_QUEUE_SERIAL); dispatch_sync(queue, ^{ dispatch_sync(queue, ^{ NSLog; });});

缘由深入分析如下:dispatch_sync函数的目的队列为main_queue,而日前函数所在的类别也是main_queue。函数等待main_queue里block实践到位后才回去,而block职分加在当前main_queue队尾,block在等待dispatch_sync函数实践到位,它才会试行。彼此等待产生block永久都没有办法儿实施,死锁导致程序奔溃。

iOS dispatch_sync(dispatch_get_main_queue(卡塔尔(قطر‎, ^{ }State of Qatar;死锁原因

1:

- (void)viewDidLoad {

//dispatch_sync(dispatch_get_main_queue(), ^{
//NSLog(@3);
//死锁原因
//1:dispatch_sync在等待block语句实践到位,而block语句需求在主线程里推行,所以dispatch_sync要是在主线程调用就能促成死锁
//2:dispatch_sync是贰只的,本身就能堵塞当前线程,也即主线程。而又往主线程里塞进去贰个block,所以就能够时有爆发死锁。
//});
//dispatch_async(dispatch_get_global_queue(), ^{
//async 在主线程中 创制了二个异步线程 参与 全局并发队列,async 不会等待block 施行到位,马上回去

NSLog(@2State of Qatar;//不会以致死锁;

});

}

浅析这段代码:view DidLoad 在主线程中,也即dispatch_get_main_queue()中,执行到sync时向dispatch_get_main_queue(卡塔尔国插入同步thread,sync会等到背后的block试行到位才回到。sync又在主队列里面,是个串行队列,sync是后边才投入的,前者是主线程,所以sync想实行block必得等待前三个主线程实践到位,而主线程却

在伺机sync再次回到,去执行后续职业,进而引致死锁。

2:

dispatch_sync 和 dispatch_async 区别:

dispatch_async(queue,block卡塔尔国 async 异步队列,dispatch_async 函数会即刻赶回, block会在后台异步履行。
dispatch_sync(queue,block卡塔尔(قطر‎ sync 同步队列,dispatch_sync 函数不会马上重临,即梗塞当前线程,等待 block同步实行到位。

3:

 

GCD Queue 分为三种:

1,The main queue :主队列,主线程就是在个体系中。

2,Global queues : 全局并发队列。

3,顾客队列:是用函数 dispatch_queue_create 创设的自定义队列

 

dispatch_sync(dispatch_get_main_queue(卡塔尔(قطر‎, ^{ }卡塔尔国;死锁原因 1: - (void卡塔尔(قطر‎viewDidLoad { //dispatch_sync(dispatch_get_main_queue(卡塔尔(قطر‎, ^{ //NSLog(@3卡塔尔国; //死锁原因 //1:dispatch_sy...

barrie

  • 借使假定大家本来有6个职责要施行,大家明日要插入三个职责0,这么些职务0要在1、2、3都并发试行完了未来技术实践,而4、5、6号义务要在此个任务0结束后才允许现身,之要把职分0dispatch_barrier_async 就能够消释
  • test1
- (void)test3
{
    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);

    NSLog(@"begin");

    // 异步1
    dispatch_async(queue, ^{

        sleep(5);//为了让其他异步派发先操作;

        NSLog(@"test1");

        NSLog(@"异步----%@",[NSThread currentThread]);

    });

    // 异步2
    dispatch_barrier_async(queue, ^{



        NSLog(@"test2");

        NSLog(@"异步----%@",[NSThread currentThread]);

    });
    // 异步3
    dispatch_async(queue, ^{



        NSLog(@"test3");

        NSLog(@"异步----%@",[NSThread currentThread]);

    });
    // 异步4
    dispatch_async(queue, ^{


        NSLog(@"test4");

        NSLog(@"异步----%@",[NSThread currentThread]);

    });

    NSLog(@"end");
}
output:
2016-07-19 11:04:11.329 test2[16275:2167525] begin
2016-07-19 11:04:11.329 test2[16275:2167525] end
2016-07-19 11:04:16.333 test2[16275:2167517] test1
2016-07-19 11:04:16.333 test2[16275:2167517] 异步----<NSThread: 0x7f967ac17c40>{number = 3, name = (null)}
2016-07-19 11:04:16.334 test2[16275:2167517] test2
2016-07-19 11:04:16.334 test2[16275:2167517] 异步----<NSThread: 0x7f967ac17c40>{number = 3, name = (null)}
2016-07-19 11:04:16.334 test2[16275:2167515] test4
2016-07-19 11:04:16.334 test2[16275:2167517] test3
2016-07-19 11:04:16.335 test2[16275:2167515] 异步----<NSThread: 0x7f967ad0f030>{number = 4, name = (null)}
2016-07-19 11:04:16.335 test2[16275:2167517] 异步----<NSThread: 0x7f967ac17c40>{number = 3, name = (null)}
  • 静心:end 与test1隔了5秒,sleep操作未有起到职能,那正是dispatch_barrier_async的魅力;

  • 当心:假使将队列改成全局并发队列就不管用,必须要和谐创设的队列,假诺您传的是一个串行队列大概全局并发队列,这么些函数等同于dispatch_async函数

  • test2:

- (void)test3
{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    NSLog(@"begin");

    // 异步1
    dispatch_async(queue, ^{

        sleep(5);//为了让其他异步派发先操作;

        NSLog(@"test1");

        NSLog(@"异步1----%@",[NSThread currentThread]);

    });

    // 异步2
    dispatch_barrier_async(queue, ^{



        NSLog(@"test2");

        NSLog(@"异步2----%@",[NSThread currentThread]);

    });
    // 异步3
    dispatch_async(queue, ^{



        NSLog(@"test3");

        NSLog(@"异步3----%@",[NSThread currentThread]);

    });
    // 异步4
    dispatch_async(queue, ^{


        NSLog(@"test4");

        NSLog(@"异步4----%@",[NSThread currentThread]);

    });

    NSLog(@"end");
}
output:
2016-07-19 11:18:14.030 test2[16305:2174509] begin
2016-07-19 11:18:14.031 test2[16305:2174509] end
2016-07-19 11:18:14.031 test2[16305:2174502] test2
2016-07-19 11:18:14.031 test2[16305:2174503] test3
2016-07-19 11:18:14.031 test2[16305:2174510] test4
2016-07-19 11:18:14.032 test2[16305:2174502] 异步2----<NSThread: 0x7fe8f96085d0>{number = 3, name = (null)}
2016-07-19 11:18:14.032 test2[16305:2174510] 异步4----<NSThread: 0x7fe8f9609b80>{number = 5, name = (null)}
2016-07-19 11:18:14.032 test2[16305:2174503] 异步3----<NSThread: 0x7fe8f96162d0>{number = 4, name = (null)}
2016-07-19 11:18:19.034 test2[16305:2174501] test1
2016-07-19 11:18:19.034 test2[16305:2174501] 异步1----<NSThread: 0x7fe8f94e02f0>{number = 6, name = (null)}
  • 一旦把异步第22中学的dispatch_barrier_async改成dispatch_barrier_sync 结果如下:
2016-07-19 11:24:53.909 test2[16322:2177141] begin
2016-07-19 11:24:58.915 test2[16322:2177125] test1
2016-07-19 11:24:58.916 test2[16322:2177125] 异步1----<NSThread: 0x7fa2f2d0a5f0>{number = 3, name = (null)}
2016-07-19 11:24:58.917 test2[16322:2177141] test2
2016-07-19 11:24:58.917 test2[16322:2177141] 异步2----<NSThread: 0x7fa2f2f2cf00>{number = 2, name = (null)}
2016-07-19 11:24:58.917 test2[16322:2177141] end
2016-07-19 11:24:58.917 test2[16322:2177125] test4
2016-07-19 11:24:58.917 test2[16322:2177144] test3
2016-07-19 11:24:58.918 test2[16322:2177125] 异步4----<NSThread: 0x7fa2f2d0a5f0>{number = 3, name = (null)}
2016-07-19 11:24:58.918 test2[16322:2177144] 异步3----<NSThread: 0x7fa2f2d471c0>{number = 4, name = (null)}
  • 请在乎end的时日顺序;方知此中差别

本文由新浦京81707con发布于软件下载,转载请注明出处:新京葡娱乐场官网死锁原因

关键词: 新浦京81707con 基础 ios iOS学习 死锁

上一篇:预览版发布,苹果发布iOS

下一篇:没有了