美文网首页
iOS 多线程-线程阻塞

iOS 多线程-线程阻塞

作者: _Waiting_ | 来源:发表于2021-08-09 17:26 被阅读0次

    产生线程阻塞的原因是:使用sync(同步)函数往当前串行队列(serial)中添加任务,这样会卡死在当前队列及出现死锁。

    队列中的任务遵循FIFO原则,dispatch_sync是立马在当前线程同步执行任务,当在同一个队列的时候,出现相互等待,就造成了死锁。

    死锁例子:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self mainQueue];
    }
    -(void)mainQueue{
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_sync(queue, ^{
            NSLog(@"%@", [NSThread currentThread]);
        });
    }
    

    原因:
    程序运行的当前队列是主队列,主队列是特殊的串行队列,在串行队列中添加同步执行函数,就是要立马执行dispatch_sync函数里面的代码,但此时主队列还没有执行完毕无法释放CPU,又去执行主队列,造成任务卡死,出现死锁。


    MAIN
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self myQueue];
    }
    -(void)myQueue{
        dispatch_queue_t queue = dispatch_queue_create("SerialQueue", DISPATCH_QUEUE_SERIAL);
        
        dispatch_sync(queue, ^{
            dispatch_sync(queue, ^{
                NSLog(@"%@", [NSThread currentThread]);
            });
        });
        
        dispatch_async(queue, ^{
            dispatch_sync(queue, ^{
                NSLog(@"%@", [NSThread currentThread]);
            });
        });
    }
    

    两种方式都会照成死锁。队列中的任务遵循FIFO原则,dispatch_sync是立马在当前线程同步执行任务,当在同一个队列的时候,出现相互等待,就造成了死锁。

    相关文章

      网友评论

          本文标题:iOS 多线程-线程阻塞

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