第8章:多线程面试问题——一、GCD;二、NSOperation;三、NSThread;四、多线程与锁

一、GCD

     1、同步/异步 和 串行/并发

1)、GCD调用的四种组合

    dispatch_sync(serial_queue,^{…}); 同步调用串行队列

    dispatch_async(serial_queue,^{…});异步调用串行队列

    dispatch_sync(concurrent_queue,^{…});

    dispatch_async(concurrent_queue,^{…});

2)、dispatch_sync(serial_queue,^{…}); 同步调用串行队列

     回答出死锁的6分,还要回答出为什么死锁才能满分。死锁原因如下:

3)、dispatch_async(serial_queue,^{…});异步调用串行队列

     下面代码不会像同步串行一样产生死锁。

4)、dispatch_async(concurrent_queue,^{…});异步并发

     为什么printLog函数不执行呢?因为不管GCD通过哪个队列执行,最终都会在底层的线程中执行,但是底层线程默认没有开启runLoop,所以perform函数不执行。

     2、dispatch_barrier_async

1)、怎样通过GCD实现多读单写?

     dispatch_barrier_async(concurrent_queue,^{//写操作})

     读操作为什么不用异步呢?因为读操作需要立即返回结果。而并发队列保证了多个线程可以并发执行。

     3、dispatch_group相关知识点

1)、使用GCD实现这个需求?A、B、C三个任务并发,完成后执行任务D?

     我认为作者的讲解是错的,作者的代码只能保证block执行完成后开始执行D操作,并不能保证图片都下载成功后去执行D操作。

 

二、NSOperation

     1、主要优点

a、可以添加任务依赖

b、可以控制任务执行状态:isReady、isExecuting、isFinished、isCancelled。如果只重写了main方法,则系统会控制任务执行状态的变化以及任务的退出。如果重写了start方法,则需要自行控制任务状态。

c、可以控制最大并发量

     2、oc源码说明系统如何控制任务状态

该处源码解读基于gnustep-base-1.24.9版本

     _finish方法的实现如下:

     3、系统怎样移除一个isFinished=YES的NSOperation的?===网上再搜搜,印证一下!

任务完成后_finish方法通过KVO的方式变更finished状态为YES,系通过通过NSOperation Queue来监听该KVO,然后在合适的时机移除该NSOperation对象。

 

三、NSThread

     NSThread相关的面试问题往往是结合RunLoop来考察的。

     1、NSThread的启动流程

     2、NSThread实现的常驻线程

比着上图,只是在为NSThread指定的selector中启动RunLoop,如下图

     3、NSThread的实现机制,即start方法的解读

该处源码解读基于gnustep-base-1.24.9版本。

线程的启动函数nsthreadLauncher源码如下:

线程的main函数源码如下:

start方法开始做了一些异常的判断,经历了这些异常判断之后,在1201行调用pthread_create函数来创建线程,然后在该函数中调用线程的启动函数nsthreadLauncher,nsthreadLauncher函数中调用线程的main函数,main函数调用创建线程时传进来的selector,如果要实现常驻线程,则在selector中调起RunLoop。

 

四、多线程与锁

     1、iOS中有哪些常用锁?

a、@synchronized:一般在创建单例对象的时候使用。

b、atomic:修饰属性的关键字;对被修饰对象进行原子操作(不负责使用)

c、OSSpinLock:自旋锁,循环等待访问,不释放当前资源==对这个解释我不理解,再搜搜??用于轻量级数据访问,如简单的int值+1/-1操作。

d、NSRecursiveLock:递归锁,特点是可以重入。

e、NSLock:一般用于线程同步。

      这个情况可以通过换成递归锁解决。

f、dispatch_semaphore_t:信号量

     2、dispatch_semaphore_t讲解

1)、dispatch_semaphore_t常用函数

     dispatch_semaphore_create(int value)创建数值为value的信号量;

     dispatch_semaphore_wait(semaphore,time)设置当前线程对信号量的等待时间(如DISPATCH_TIME_FOREVER代表永远),如果没有资源则等待;

     dispatch_semaphore_singal(semaphore)释放信号量的一个值;

2)、dispatch_semaphore_create()函数

     该函数主要用于创建semaphore结构,semaphore结构定义如下:struct semaphore{int value; List<thread>;}其中value是信号量的值,List存储被阻塞的线程的唯一标识,如pid。

3)、dispatch_semaphore_wait()函数

     函数主要实现如图,途中第二句代码的意思是如果信号量的值小于0,则调用该函数的线程主动的将自己阻塞起来。

4)、dispatch_semaphore_singal()函数

     函数主要实现如图,途中第二句代码的意思是如果信号量的值小于等于0,则说明有线程处于阻塞状态,通过wakeup函数去唤醒阻塞的线程。唤醒是一个被动实现。

     3、iOS系统为我们提供的几种多线程技术各自的特点是怎样的?

1)、GCD用来实现一些简单的线程同步,包括一些子线程的分派,包括实现一些类似于多读单写这种场景的问题

2)、NSOperation和NSOperation Queue由于可以控制任务状态、依赖,所以AFNetwork和SDWebImage内部都使用者两个类实现多线程。

3)、NSThread常用于实现常驻线程。GCD和NSOperation都不能实现常驻线程,因为他们底层都是通过系统的线程池执行任务。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在网络编程中,多线程编程是一种常用的技术,可以提高程序的并发性和性能。下面是一些关于多线程编程的常用方法和注意事项: 1. NSThreadNSThread是iOS中最底层的线程类,它可以通过类方法或实例方法来创建线程。使用NSThread可以设置线程的名称、优先级,以及控制线程的睡眠和退出等操作。 2. 线程调度:在多线程编程中,多个线程会并发运行,但线程的执行顺序是由CPU调度器决定的,程序员无法控制。多个线程会同时竞争CPU资源,谁先抢到资源谁就先执行,所以多线程执行顺序是随机的。 3. 多线程的创建:在iOS开发中,常用的多线程编程方式有种:NSThreadGCDNSOperationNSThread是最底层的线程类,可以直接操作线程的各种属性和方法。GCD(Grand Central Dispatch)提供了一种高效的并发编程模型,可以通过队列来管理任务执行NSOperation是基于GCD的更高层次的封装,提供了更多的控制和管理线程的功能。 4. 线程的创建顺序:在多线程编程中,并不能保证哪个线程会先运行,即无法确定新创建的线程或调用线程哪个会先执行。新创建的线程可以访问进程的地址空间,并继承调用线程的浮点环境和信号屏蔽字,但挂起信号集会被清除。 总结来说,多线程编程是一种提高程序并发性和性能的技术,在网络编程中尤为重要。通过使用NSThreadGCDNSOperation等方法,可以实现多线程的创建和管理。然而,程序员无法控制线程的执行顺序,因为线程的调度是由CPU调度器决定的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [IOS之多线程基础(OC)](https://blog.csdn.net/yong_19930826/article/details/105857055)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [UNIX环境高级编程笔记](https://blog.csdn.net/w_x_myself/article/details/128613534)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值