IOS开发多线程讲解(二)

作者: 星辰_入海 | 来源:发表于2019-05-01 16:06 被阅读22次
    小编专题欢迎加入

    大家五一快乐,劳动节,让我们劳动一下!上文提及多线程的引入,以及多线程的dispatch_async(dispatch_get_main_queue,^{});的使用,今天我们继续进入多线程的学习

    一.dispatch_queue_create
    • 通过dispatch_queue_create函数可以生成Dispatch Queue
    dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",NULL);
    

    解析:在讲解dispatch_queue_create之前,我们可以观察到MySerialDispatchQueue中的Serial Dispatch Queue和上一节讲解的内容是一样的(https://www.jianshu.com/p/b1e6be5cd2fe),通过上一回内容,我们可以了解到Serial Dispatch Queue and Concurrent Dispatch Queue的使用

    - Serial Dispatch Queue

    执行一个线程任务,当一个线程任务结束后,便可以执行下一个任务

    - Concurrent Dispatch Queue

    执行多个线程任务,在执行A的同时,可以申请执行B的任务,以此循环往复,知道所有任务全部被执行

    虽然我们发现Serial Dispatch Queue and Concurrent Dispatch Queue 都受到了系统资源的限制,但是使用dispatch_queue_create可以生成多个Serial Dispatch Queue,同时让每个Serial Dispatch Queue并行执行 图1--多个Serial Dispatch Queue
    [使用dispatch_create创建4个Serial Dispatch Queue线程,虽然每一个Serial Dispatch Queue执行一个线程,但是这4个Serial Dispatch Queue属于并发执行]

    虽然,可以使用这样的方式来创建多个线程,但是这无疑会增加内存的巨大消耗,从而引起大量的 上下文切换,导致大幅度降低系统的响应性能

    有时候使用Serial Dispatch Queue是为了防止多个线程更新相同资源而导致数据竞争使用Serial Dispatch Queuea 图2--数据竞争

    解决使用Serial Dispatch Queue 图3--Serial Dispatch Queue

    当想要执行并发同时不发生数据竞争等问题时候,我们也可以使用Concurrent Dispatch Queue,对于Concurrent Dispatch Queue来说不论生成多少个,由于XNU内核只使用有效管理的线程,因此不会发生Serial Dispatch Queue的问题

    好啦,回到最初的分析问题上来,对于dispatch_queue_create的解析

    dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",NULL);
    

    dispatch_queue_create接收的第一个参数是使用应用程序ID逆序全名程域名

    • 当dispatch_queue_create想要生成Serial Dispatch Queue时候,第二个参数使用NULL
    • 当dispatch_queue_create想要生成Concurrent Dispatch Queue时候,第二个参数使用DISPATCH_QUEUE_CONCURRENT
    dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",DISPATCH_QUEUE_CONCURRENT);
    

    dispatch_queue_create的返回值类型为dispat_queue_t类型

    dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_async(myConcurrentDispatchQueue,^{
          NSLog(@"This my Concurrent Dispatch Queue");
    });
    

    虽然,在Xcode中我们有ARC自动释放内存,但是对于我们自己创建的线程需要自己来释放

    dispatch_release(myConcurrentDispatchQueue);   
    dispatch_release(mySerialDispatchQueue);   
    
    总结:本文讲述了dispatch_queue_create的使用方法,需要注意的是其中的返回值为dispatch_queue_t,同时,程序员需要自己释放自己生成的线程,同时,注意生成Serial Dispatch Queue and Concurrent Dispatch Queue的方法.下文,我们将讲述关于常用的线程的其它使用方法,其次,五一过后,我们继续进入视图控件的学习--以及对于小编自己写的一个DEMO进行讲解。

    相关文章

      网友评论

        本文标题:IOS开发多线程讲解(二)

        本文链接:https://www.haomeiwen.com/subject/thfwnqtx.html