iOS开发多线程同步

移动开发
今天跟大家聊聊iOS开发中多线程同步的话题。说到多线程同步,各位童鞋可能立刻会想到NSLock、NSCondtion甚至OSSpinLock等等各种线程锁。但是,今天我们不谈线程锁,各位如果对Lock有兴趣,可以看看这篇文章,既然不谈线程锁,那说啥?当然是说多线程同步

[[141553]]

Hi,今天跟大家聊聊iOS开发中多线程同步的话题。说到多线程同步,各位童鞋可能立刻会想到NSLock、NSCondtion甚至OSSpinLock等等各种线程锁。但是,今天我们不谈线程锁,各位如果对Lock有兴趣,可以看看这篇文章,既然不谈线程锁,那说啥?当然是说多线程同步

线程同步不等于线程锁。要解决同步问题,首先需要了解为什么需要线程同步,线程不同步主要原因在于多个线程可能同时操作某个对象从而导致状态不一致的问题。是不是可以这么理解,如果多线程不会同一时刻访问对象就解决了同步问题。如何做到这一点?可以采用串行队列的思想,何为串行队列?可以简单理解为所有操作都必须按顺序依次执行。主线程就是串行队列,最简单的同步方式就是把同步操作放到主线程执行,然并卵,当我没说

既然不能在主线程执行,放到子线程不就OK?创建子线程的方式有很多,不累述,有兴趣的童鞋可以各显神通

GCD同步

GCD可能是创建子线程最简单的方式之一,关于GCD,这篇文章做了比较详细的介绍,不再进一步描述。既然要实现线程同步,首先需要创建串行队列

 
  1. _queue = dispatch_queue_create("com.olinone.synchronize.serialQueue", NULL); 
  2. dispatch_queue_t dQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
  3. dispatch_set_target_queue(_queue, dQueue); 

然后,将所有同步事件依次加入队列中即可确保多线程同步

 
  1. dispatch_async(_queue, ^{ 
  2.     block(); 
  3. }); 

NSOperationQueue同步

通过GCD的方式即可满足绝大多数需求,但是也难免有个别特殊需求,比如操作的取消。此时,NSOperationQueue将是不错的选择

NSOperationQueue虽然是并发多线程池,但是巧妙的设计也可以让其实现串行队列的功能。当maxConcurrentOperationCount=1的时候,同一时刻只有一个NSOperation被执行,NSOperationQueue就由并发执行变成串行执行

  1. NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
  2. operationQueue.maxConcurrentOperationCount  = 1

实现方式与GCD一样,依次将同步操作加入到线程池中即可实现同步操作的串行执行

 
  1. - (void)execSyncBlock:(void (^)())block { 
  2.     if (NSOperationQueue.currentQueue == self) { 
  3.         block(); 
  4.     } else { 
  5.         NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:block]; 
  6.         [self addOperations:@[operation] waitUntilFinished:YES]; 
  7.     } 

HJSynchronizeDemo详细展示了实际使用方式。巧妙的利用串行队列可以带来意想不到的效果。除了解决多线程同步,还能够处理串行式大计算等业务,比如图片渲染,音频处理等等

责任编辑:倪明 来源: 庞海礁的个人空间
相关推荐

2015-07-22 09:51:51

iOS开发线程

2013-07-16 12:13:27

iOS多线程多线程概念GCD

2010-01-21 11:27:30

linux多线程机制线程同步

2011-08-18 17:07:23

IOS开发多线程NSInvocatio

2009-03-24 08:56:23

数据同步多线程Java

2011-07-20 10:50:19

苹果 OpenCL 多线程

2024-02-27 10:44:58

C#线程后端

2011-08-02 10:26:59

iOS 多线程 线程

2013-07-16 10:12:14

iOS多线程多线程概念多线程入门

2016-04-12 09:48:24

nsthread多线程ios

2010-01-21 11:23:49

Linux多线程同步消息队列

2009-09-14 19:39:14

批量线程同步

2014-07-21 10:03:56

2019-06-06 15:49:53

多线程iOS开发操作

2011-04-14 13:27:53

Synchronize多线程

2010-03-15 19:37:00

Java多线程同步

2010-01-21 11:22:35

Linux多线程同步

2013-07-15 15:35:06

2013-07-16 10:57:34

iOS多线程多线程概念多线程入门

2011-06-22 13:47:16

Java多线程
点赞
收藏

51CTO技术栈公众号