## 1. iOS 中有多少类型的线程? * PThread:跨系统,对C语言的封装。很少使用,不推荐使用。 * NSThread:面向对象,需要手动管理生命周期。 * GCD:Grand Central Dispatch,主打任务与队列。 * NSOperation & NSOperationQueue:基于GCD的封装,面向对象。 ## 2. GCD 有那些队列,默认提供那些队列? * 主队列:dispatch_get_main_queue * 全局并发队列:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) * 自定义队列:dispatch_queue_create("队列名字", DISPATCH_QUEUE_SERIAL) ## 3. GCD 栅栏函数 栅栏函数用来处理多读单写事件,使用如下: ``` dispatch_queue_t queue = dispatch_queue_create("testqueue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ NSLog(@"----1-----%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"----2-----%@", [NSThread currentThread]); }); dispatch_barrier_async(queue, ^{ NSLog(@"----barrier-----%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"----3-----%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"----4-----%@", [NSThread currentThread]); }); ``` 注意:栅栏函数使用时,不能使用全局队列,只能使用自定义的队列。 #### 3.1 `dispatch_barrier_sync` 和 `dispatch_barrier_async` 的区别? * dispatch_barrier_sync:前面的 block 全部添加并执行完成之后,再执行barrier 中的内容。然后再添加并执行之后的 block 内容。会影响主线程的执行。 * dispatch_barrier_async:将前面的 block 全部添加之后,再添加 barrier,再添加之后的block,然后再依次执行。不影响主线程的执行。
标签:barrier,队列,dispatch,queue,线程,NSThread,async From: https://www.cnblogs.com/dulinshun/p/18041062/xian-cheng