前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程(一) 有关死锁以及串行并发同步异步概念

多线程(一) 有关死锁以及串行并发同步异步概念

作者头像
老沙
发布2019-09-28 13:20:14
7110
发布2019-09-28 13:20:14
举报
文章被收录于专栏:老沙课堂老沙课堂

多线程(一) 有关死锁以及串行并发同步异步概念

多线程

1、并发 串行 异步 同步

并发 串行 是指队列
异步同步 只是是否能开启线程
举个?

并发队列 (双行(多行)道路 可以超车 只要你可以)

可以让多个任务并发执行 (异步的时候可以超车 所以可以并发)

同步或者异步 (你有没有超车的能力) 是否具备开启新线程的能力

串行队列 (单行线)

任务一个接一个 无论同步还是异步 (无论有没有超车能力都只能一条线)

  • ==队列(串行并发) 决定了运行方式==
  • ==同步异步 决定了能否开启新线程的能力 (主队列只在主线程)==

2、死锁

案例1

题目:
代码语言:javascript
复制
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"1");
        [self performSelector:@selector(test) withObject:nil afterDelay:0];
        NSLog(@"3");
    });
}

- (void) test {
    NSLog(@"2");
}
执行结果:
代码语言:javascript
复制
2019-09-01 17:55:37.962948+0800 GCD[16903:233631] 1
2019-09-01 17:55:37.963250+0800 GCD[16903:233631] 3	
复制代码
分析原因:

未执行原因:RunLoop未开启 消息添加到RunLoop中也不会被调用。

performSelector: withObject: 底层调用[self msgSend];

performSelector: withObject:afterDelay; RunLoop相关

往RunLoop里面添加一个定时器

解决办法::

开启线程RunLoop

案例2

题目:
代码语言:javascript
复制
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSThread *thread = [[NSThread alloc] initWithBlock:^{
        NSLog(@"1");
    }];
    [thread start];
    [self performSelector:@selector(test) onThread:thread withObject:nil waitUntilDone:YES];
    NSLog(@"3");
}

- (void) test {
    NSLog(@"2");
}
执行结果:
代码语言:javascript
复制
2019-09-01 18:23:51.670983+0800 GCD[17915:253178] 1
2019-09-01 18:23:51.674352+0800 GCD[17915:253102] *** Terminating app due to uncaught exception 'NSDestinationInvalidException', reason: '*** -[ViewController performSelector:onThread:withObject:waitUntilDone:modes:]: target thread exited while waiting for the perform'
...	
分析原因:

block执行完毕后 线程没有开启RunLoop。所以线程销毁,销毁后再调用所以崩溃。

解决办法:

开启RunLoop

代码语言:javascript
复制
NSThread *thread = [[NSThread alloc] initWithBlock:^{
        NSLog(@"1");
        [[NSRunLoop currentRunLoop] addPort:[NSPort new] forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] run];
    }];
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老沙说点事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多线程(一) 有关死锁以及串行并发同步异步概念
    • 多线程
      • 1、并发 串行 异步 同步
      • 2、死锁
      • 案例1
      • 案例2
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档