线程

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_syncdispatch_barrier_async 的区别?

  • dispatch_barrier_sync:前面的 block 全部添加并执行完成之后,再执行barrier 中的内容。然后再添加并执行之后的 block 内容。会影响主线程的执行。
  • dispatch_barrier_async:将前面的 block 全部添加之后,再添加 barrier,再添加之后的block,然后再依次执行。不影响主线程的执行。
posted @ 2024-02-28 16:58  dulinshun  阅读(10)  评论(0)    收藏  举报