IOS_多线程

举报
清雨小竹 发表于 2022/09/25 03:26:57 2022/09/25
【摘要】 苹果的Cocoa框架支持的多线程机制有三中NSThread、GCD、NSOperation。 NSThread:是官方推荐的也是最基本的线程创建方式,但是需要开发这自己去管理线程的生命周期例如线程同步和内存共享等问题。 NSOperation:如果想要多个线程并行那么就需要把线程加入队列中,NSOperationQueue提供...

苹果的Cocoa框架支持的多线程机制有三中NSThread、GCD、NSOperation。

NSThread:是官方推荐的也是最基本的线程创建方式,但是需要开发这自己去管理线程的生命周期例如线程同步和内存共享等问题。


NSOperation:如果想要多个线程并行那么就需要把线程加入队列中,NSOperationQueue提供了队列的管理方法,我们可以用addOperation把线程对象以数组的形式一次性加入到队列中,并且可以设置队列的并行数量。线程执行是有序的


GCD:Grand Central DisPatch(中央调度)是Apple多核编程的解决方法。IOS4.0后引入,通过blocks实现多线程机制。

************************************************************************************************************

GCD  VS  NSOperation:

GCD是一种用轻量级的代码来实现的工作单元,有益于把代码合并执行。不需要手动管理,统一有系统负责调度。但是比较难实现线程之间的依赖关系,没法按序列执行。

NSOperation:比起GCD来说会增加代码量,但是可以添加线程之间的依赖关系,有益于序列化执行线程。并且NSOperation兼容KVO。可以设置键值监听。


线程之间同步方法:

@synchronized、NSLock、递归锁NSRecursiveLock、条件锁NSConditionLock、分布锁NSDistributedLock


》》GCD下实现多线程同步互斥:

GCD下的dispatch_queue队列都是FIFO(先入先出)队列,会按照队列提交树勋执行。

同步dispatch_sync、异步dispatch_async.

》》GCD下的线程分组:


  
  1. dispatch_group_t group = dispatch_group_create();
  2. dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
  3. // 并行执行的线程一
  4. });
  5. dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
  6. // 并行执行的线程二
  7. });
  8. dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
  9. // 汇总结果
  10. });

信号量用来实现多个线程之间获取同一个资源的个数,当资源个数>0的时候执行操作,小于等于0的时候阻塞。


  
  1. // 信号量初始化为1
  2. dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
  3. dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
  4. //1.先去网上下载图片
  5. dispatch_async(queue, ^{
  6. // wait操作-1
  7. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  8. // 开始下载
  9. // signal操作+1
  10. dispatch_semaphore_signal(semaphore);
  11. });
  12. // 2.等下载好了再在刷新主线程
  13. dispatch_async(dispatch_get_main_queue(), ^{
  14. // wait操作-1
  15. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  16. //显示图片
  17. // signal操作+1
  18. dispatch_semaphore_signal(semaphore);
  19. });


文章来源: zzzili.blog.csdn.net,作者:清雨小竹,版权归原作者所有,如需转载,请联系作者。

原文链接:zzzili.blog.csdn.net/article/details/39034209

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。