iOS开发(12)多线程

2019-04-02  本文已影响0人  迷心迷

一、多线程

1、iOS中的常见多线程方案


1.png

2、GCD的常用函数
a) GCD中有2个用来执行任务的函数

/*!
 * @function dispatch_sync
 *
 * @abstract
 * Submits a block for synchronous execution on a dispatch queue.
 *
 * @discussion
 * Submits a workitem to a dispatch queue like dispatch_async(), however
 * dispatch_sync() will not return until the workitem has finished.
 */

void
dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);

b) GCD源码:https://github.com/apple/swift-corelibs-libdispatch

3、GCD的队列
GCD的队列可以分为2大类型

4、容易混淆的术语
有4个术语比较容易混淆:同步、异步、并发、串行

5、各种队列的执行效果


2.png

6、队列组的使用

二、线程同步

1、多线程的安全隐患

2、多线程安全隐患示例01 – 存钱取钱


4.png

3、多线程安全隐患示例02 – 卖票


5.png

4、多线程安全隐患分析


6.png

5、多线程安全隐患的解决方案

7.png

三、线程同步方案

1、iOS中的线程同步方案

2、GNUstep

3、OSSpinLock

4、os_unfair_lock

9.png

5、pthread_mutex

pthread_mutex – 递归锁


11.png

pthread_mutex – 条件


12.png

6、NSLock、NSRecursiveLock

7、NSCondition

8、NSConditionLock

9、dispatch_semaphore

10、dispatch_queue

11、@synchronized

18.png

12、iOS线程同步方案性能比较

13、自旋锁、互斥锁比较

14、atomic

15、iOS中的读写安全方案

16、pthread_rwlock

17、dispatch_barrier_async

面试题

1、你理解的多线程?

2、iOS的多线程方案有哪几种?你更倾向于哪一种?

3、你在项目中用过 GCD 吗?

4、GCD 的队列类型

5、说一下 OperationQueue 和 GCD 的区别,以及各自的优势

6、线程安全的处理手段有哪些?

7、OC你了解的锁有哪些?在你回答基础上进行二次提问;
追问一:自旋和互斥对比?
追问二:使用以上锁需要注意哪些?
追问三:用C/OC/C++,任选其一,实现自旋或互斥?口述即可!

8、请问下面代码的打印结果是什么?


11.png

打印结果是:1、3
原因
performSelector:withObject:afterDelay:的本质是往Runloop中添加定时器
子线程默认没有启动Runloop

9、请问下面代码的打印结果是什么?


12.png

打印1,然后程序崩溃。

解决方案:在block里面启动runloop

NSThread *thread = [[NSThread alloc] initWithBlock:^{
        NSLog(@"1");
        
        [[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }];
    [thread start];
    
    [self performSelector:@selector(test) onThread:thread withObject:nil waitUntilDone:YES];

打印 1 2

上一篇下一篇

猜你喜欢

热点阅读