美文网首页
GCD一些应用的知识点

GCD一些应用的知识点

作者: 韩叨叨 | 来源:发表于2017-12-13 15:27 被阅读31次

本篇各种零散的点,是自己在看教学视频时整理的知识点。

GCD队列

  • 主队列
  • 串行队列
  • 并行队列
FIFO   
线程安全

在串行队列里dispatch_sync会直接crash (DISPATCH_CLIENT_CRASH)。因为在代码走到这里直接就进入crash,而不会再往下走,进入wait了。

内部临界区: 只能有一个线程或是特定的线程执行的一段代码。

外部临界区:
业务代码不能被两个或多个线程同时执行。(串行队列)

优先级适用不恰当造成

  • 竞态条件:
    两个或多个线程读写某些共享数据,而最后的结果取决于线程运行的精确时序。
  • 优先级反转:
    优先级高的在等待优先级低的先完成,在等待的同时,另一个优先级低的线程不用等待,就跑在了优先级高的线程前面,造成优先级反转。所以,几乎总是使用默认优先级队列。

dispatch source

是一个监听某些类型事件的对象,当这些事件发生时,它自动将一个Block放入一个dispatch queue的执行过程中。

source_t time 与 NSTimer 的区别

NSTimer是持有传入的target,用完之后忘记释放的话,会造成内存泄漏。而且是跟runloop相关,有时候会容易触发在不同的runloop会出现不同情况。(NSDefaultRunLoop不会计时)

source_t 就没有那么多问题,比较好用。


隐藏的API

-dispatch_queue_set_width
设置队列宽度,1 为串行;>1 为并行。(系统创建串,并行队列时也是这么创建的)

-dispatch_benchmark
统计代码的执行效率

-dispatch_block_cancel
可以取消一个block


class initialization

  • 运行时会在类对象收到其他消息之前调用initialize。
  • 多线程情况下,保证initialize在收到第一条消息的那个线程调用。
  • 多线程情况下,如果initialize执行过程中,其他线程给这个类发送消息,会block直到这个initialize调用完成。

AutoreleasePool

  • 每个线程都保持自己的pool对象
  • 主线程的pool对象会自动创建和销毁

RunLoop

  • 每个线程只有一个runloop
  • 每个runloop有自己的input modes,之间互不干扰
  • 主线程runloop自己运行,子线程手动
  • 调用NSRunLoop方法是线程不安全的,需要在runloop所以在的线程调用。

====

  • 是线程的一个基础设施,不能脱离线程存在
  • 管理事件/source/timer source
  • 没有处理消息时休眠以避免资源占用
  • 有消息到来时立刻被唤醒

线程同步

  • 加锁
  • 原子操作
  • synchronize
    。。。
SpinLock

线程通过busy-wait-loop的方式来获取锁,任时刻只有一个线程能够获得锁,其他线程忙等待直到获得锁

问题:产生优先级反转
原则:1、临界区简单,非耗时操作
     2、线程同一优先级
@synchronized
  • 只有传同样的对象给synchronized,才能起到加锁作用
  • 如果传nil,是 法起到加锁作用的
  • 可以重入
  • synchronized不会持有传给它的对象
  • 你在synchronized里面销毁了这个对象,不会有问题
  • synchronized内部有异常处理,所以不用担心异常产生的时候不会unlcok。
Runloop Source
source 0:
         非基于port,用于用户主动触发事件
         只包含一个回调,并不能主动触发事件,需要先调用CFRunLoopSourceSignal(source),然后手动调用CFRunLoopWeakUp(runloop)唤醒runloop,让其处理。
source 1:
         基于port,用于内核与线程之间通信,包含一个mach_port和一个回调,被用于通过一个内核和其他线程互发消息,可以主动唤醒runloop。

两个APP之间通信

  1. URL
  2. 剪切板
  3. keychain
  4. 服务器中转
  5. source

相关文章

  • GCD一些应用的知识点

    本篇各种零散的点,是自己在看教学视频时整理的知识点。 GCD队列 主队列 串行队列 并行队列 在串行队列里disp...

  • 13 个 GCD 应用场景

    13 个 GCD 应用场景 13 个 GCD 应用场景

  • 源码剖析:探究 Repeat 中 GCD 的应用

    源码剖析:探究 Repeat 中 GCD 的应用源码剖析:探究 Repeat 中 GCD 的应用

  • GCD 中的线程组 Group

    前言 本文主要介绍 GCD 中的线程组 Group,不讲 GCD 基础概念知识。如果对 GCD 的基本知识点不是很...

  • GCD相关知识点

    GCD相关知识点 多线程技术--GCD 深入学习GCD GCD 深入理解:第一部分 GCD 深入理解:第二部分 1...

  • RunLoop

    什么是RunLoop 在程序运行中不断的循环做一些事情应用范畴:定时器,PerfromSelector, GCD ...

  • 多线程之GCD

    本文介绍什么是GCD 、 GCD的优势有哪些、GCD到底是什么?、 CGD的实际应用 下面开始详细解析 1.什么是...

  • iOS Objective-C GCD 应用篇

    iOS Objective-C GCD 应用篇 本文主要对GCD中的dispatch_semaphore(信号量)...

  • GCD串行并发队列

    学习完本篇,您会对以下知识点更加理解: 队列 串行队列 并发队列 GCD全局队列 GCD主队列 创建串行队列 创建...

  • iOS 多线程之 GCD

    GCD全称Grand Central Dispatch 。应用程序以Block块对象的形式提交任务到队列,GCD提...

网友评论

      本文标题:GCD一些应用的知识点

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