GCD 之线程死锁

来源:互联网 发布:电脑桌面图标整理软件 编辑:程序博客网 时间:2024/04/28 03:56

GCD相比NSOperation,无法cancel正在进行的线程。
GCD用不好会造成死锁。

- (void)viewDidLoad{    [super viewDidLoad];    NSLog(@"=================1");    dispatch_sync(dispatch_get_main_queue(), ^{        NSLog(@"=================2");    });    NSLog(@"=================3");}

dispatch_sync 函数不会立即返回,会阻塞当前线程,等待 block同步执行完成。而且它是在主线程上,所以block和主线程互相等待。

    int count = 0;    do {        NSLog(@"1");        dispatch_async(dispatch_get_main_queue(), ^{            NSLog(@"2");        });        NSLog(@"3");        count ++;    }while (count < 100);    while(1);//注释掉这句就不会死锁

2永远不会被打印,主线程被阻塞了,dispatch_async 函数会立即返回, block会在后台异步执行,如果没有while(1)阻塞主线程的话不会造成死锁。

总的来说,GCD中全局队列属于并行队列,里面可以有多个字线程运行。主队列是串行队列,一个一个操作挨个之行,这种情况下入如果循环等待那么就会死锁。

   do {        NSLog(@"1");        dispatch_async(dispatch_get_global_queue(0, 0), ^{   NSLog(@"4");         dispatch_async(dispatch_get_main_queue(), ^{                NSLog(@"2");            });        });        NSLog(@"3");        count ++;    }while (count < 100);

打印结果是1 43 134(3 4不确定顺序) 2是最后打印的,

0 0
原创粉丝点击