zoukankan      html  css  js  c++  java
  • 多线程GCD(二)

    GCD

     函数

     

    队列:

    队列和函数

     

     

     

    这里崩溃的原因是死锁:(相互等待执行完成)

    串行队列里面添加的顺序是:2 - block - 4 - 3

    因为是串行队列,所以4 的执行需要等待block执行,block执行完成依赖于3,3又要等待4执行完毕,所以造成死锁。

    队列:

    队列的特征是FIFO,并发队列也是先进先执行,只是不会等待一个任务执行完毕才执行下一个。

    //1. 通常的多个请求处理方法 

    //2. 使用全局队列,阻塞主线程

    //3. 使用任务的形式封装多个网络请求,不会阻塞主线程,可以执行其他的事情

    #pragma mark - 栈栏函数:dispatch_barrier_sync/dispatch_barrier_async (这里需要注意一个问题,就是栈栏函数一定要在自己创建的队列,不然没有效果,因为如果连全局队列也阻塞的话,系统就停止了,系统如果停止,那么也就没有意义了。)

     

    因为多线程导致的signal崩溃,线程BUG,很多线程去操作,但是操作不过来

     

     

    解决方式:加@synchronized锁

    或者:dispatch_barrier_sync栈栏函数

     栈栏函数总结:

    //    栈栏函数:

    //    1. 保证顺序执行

    //    2. 保证线程安全

    //    注意点:

    //    3. 一定要是自定义的并发队列

    //    4. 不是非常优秀

    //    5.如果是dispatch_barrier_async只阻塞当前的自定义并发队列,这种就不是很友好,因为别人在使用你的时候,不知道你是封装到一个队列中的,就完成不了顺序执行了,会出现问题,过度依赖于一个队列了,不利于封装。

    调度组:队列随便选,想在哪个队列执行就在哪个队列执行,就是不依赖与队列

     

    调度组的入组和出组必须成对的存在

    信号量控制并发数:

     

     diapatch_source:

    runlooprun 里面用到了一部分dispatch_source,在判断超时的时候

    dispatch_source 实现响应式,数据回调

     

     

     

  • 相关阅读:
    docker镜像制作及上传到远端镜像仓库
    mysql索引进阶
    电子商务需要用到香港服务器吗?
    golang module goland 配置代理
    nginx做linux服务时,日志有权限提示没权限(nginx: [emerg] open() "/home/www/log/error.log" failed)
    Yaml 、Json 、Dict 之间的转化
    CodeSmith .NET三层架构模板
    C#获取26个英文字母
    基于PCASClass.js和layui.js的城市三级联动
    MySQL变量的使用
  • 原文地址:https://www.cnblogs.com/coolcold/p/12194537.html
Copyright © 2011-2022 走看看