线程同步的几种方式

1. NSOperation实现的多线程(添加线程依赖、阻塞当前线程)

- (void)waitUntilFinished;阻塞当前线程,直到该操作结束。可用于线程执行顺序的同步。

- (void)setCompletionBlock:(void (^)(void))block;completionBlock会在当前操作执行完毕时执行 completionBlock。

- (void)addDependency:(NSOperation *)op;添加依赖,使当前操作依赖于操作 op 的完成。

- (void)removeDependency:(NSOperation *)op;移除依赖,取消当前操作对操作 op 的依赖。

@property (readonly, copy) NSArray *dependencies;在当前操作开始执行之前完成执行的所有操作对象数组。

2. GCD实现的多线程

- dispatch_group_async

个人理解:将代码块dispatch_block_t block放入队列dispatch_queue_t queue中执行;并和调度组dispatch_group_t group相互关联;如果提交到dispatch_queue_t queue中的block全都执行完毕会调用dispatch_group_notify并且dispatch_group_wait会停止等待;

- dispatch_group_enter(group)、dispatch_group_leave(group)

个人理解:和内存管理的引用计数类似,我们可以认为group也持有一个整形变量(只是假设),当调用enter时计数加1,调用leave时计数减1,当计数为0时会调用dispatch_group_notify并且dispatch_group_wait会停止等待;

3、dispatch_group_notify

个人理解:当关联到dispatch_group_t上的dispatch_group_async任务执行完毕或者是关联在上面的dispatch_group_enter、dispatch_group_leave成对出现了。参数中的dispatch_block_t block会被提交到dispatch_queue_t queue中执行。

4、dispatch_group_wait

个人理解:和dispatch_group_notify功能类似(多了一个dispatch_time_t参数可以设置超时时间),在group上任务完成前,dispatch_group_wait会阻塞当前线程(所以不能放在主线程调用)一直等待;当group上任务完成,或者等待时间超过设置的超时时间会结束等待

你可能感兴趣的:(线程同步的几种方式)