iOS 开发 Objective-C

iOS 底层 day19 多线程基本概念 GCD线程死锁总结

2020-09-14  本文已影响0人  望穿秋水小作坊

一. 关于多线程中的一些基本概念

1. iOS 中有几种多线程方案有哪几种?分别简述一下。
主要记住 GCD 和 NSOperation 部分

二. GCD 中的一些基本概念 和 线程死锁总结

1. GCD 中有 2 个用来执行任务的函数
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
2. 比较容易混淆的术语
图解两者关系

三. GCD 中一些串行、并行、同步、异步的问题

1. 下面代码会造成死锁吗?
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"任务1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"任务2");
    });
    NSLog(@"任务3");
}
2. 下面代码会造成死锁吗?
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"任务一");
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"任务二");
    });
    NSLog(@"任务三");
}
3. 下面代码会造成死锁吗?
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"任务一");
    dispatch_queue_t queue = dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"任务二");
        dispatch_sync(queue, ^{
            NSLog(@"任务三");
        });
        NSLog(@"任务四");
    });
    NSLog(@"任务五");
}
4. 下面代码会造成死锁吗?
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"任务一");
    dispatch_queue_t queue = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"任务二");
        dispatch_sync(queue, ^{
            NSLog(@"任务三");
        });
        NSLog(@"任务四");
    });
    NSLog(@"任务五");
}
5. 下面代码会造成死锁吗?
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"任务一");
    dispatch_queue_t queue = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        NSLog(@"任务二");
        dispatch_sync(queue, ^{
            NSLog(@"任务三");
        });
        NSLog(@"任务四");
    });
    NSLog(@"任务五");
}

四. 本章最重要:一句话 来判断是否造成死锁?

使用 Sync 函数往当前串行队列中添加任务,会卡主当前的串行队列(产生死锁)

上一篇下一篇

猜你喜欢

热点阅读