GCD

1、什么是gcd?
  • 全称是Grand Central Dispatch;
  • 纯C语言,提供了很多强大的函数;
  • 是苹果公司为多核的并行运算提供的解决方案,会自动的利用更多的cpu内核,能自动管理线程的生命周期。

2、线程和队列的关系?

  • 队列是任务的管理者,线程是任务的执行者。

3、队列有几种?

  • 队列分为串行队列(FIFO)和并发队列,主队列属于串行队列,全局队列属于并发队列。主队列在main函数之前就已经创建了。

4、iOS多线程的方案有哪些?

  • iOS多线程方案分为四种:pthread,NSThread,GCD和NSOpreation。
  • 其中pthread,NSThread,需要开发者手动管理线程的生命周期。
  • NSOpreation是对GCD面向对象的封装,NSOpreation提供了添加线程的依赖关系,设置线程优先级,观察线程状态,暂停,继续,取消线程等方法,方便开发者使用,但效率方面不如GCD。

5、举例说明线程的死锁问题

    dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);

    dispatch_async(queue, ^{
        NSLog(@"1");
        dispatch_sync(queue, ^{
            NSLog(@"2");
        });
        NSLog(@"3");
    });
  • 解析:DISPATCH_QUEUE_SERIAL说明是串行队列,遵循FIFO原则, dispatch_async异步函数中有3个任务NSLog(@"1"),dispatch_sync(queue, ^{}),NSLog(@"3")会首先加入到串行队列queue中,且依次执行,但在执行dispatch_sync(queue, ^{})时,因为这里是一个同步函数,要想代码块执行完毕,此时就必须执行NSLog(@"2"),但NSLog(@"2")也是加入到同一个队列queue中的,且其排在NSLog(@"3")打印之后,所以此时就会出现互相等待的现象,想要执行NSLog(@"3")就必须执行完毕dispatch_sync(queue, ^{})代码块,想要执行完代码块就必须执行完NSLog(@"2"),想要执行完NSLog(@"2")就必须执行完NSLog(@"3")
死锁逻辑

6、常用的GCD方法及使用环境

  • 同步函数(不具备开启新线程的能力)
dispatch_sync(<#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)
  • 异步函数(并发队列中具备开启新线程的能力)
dispatch_async(<#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)
  • 信号量dispatch_semaphore_t
  • 当信号量为0的时候会堵塞线程,起到一种锁的效果
//  创建信号量 value可控制并发数量
dispatch_semaphore_create(<#intptr_t value#>)
// 信号量-1
dispatch_semaphore_wait(<#dispatch_semaphore_t  _Nonnull dsema#>, <#dispatch_time_t timeout#>)
// 信号量 +1
dispatch_semaphore_signal(<#dispatch_semaphore_t  _Nonnull dsema#>)
  • 栅栏函数dispatch_barrier_async
  • 将函数两边的任务隔开,栅栏函数之前的任务执行完毕之后,才会执行栅栏函数之后的任务
dispatch_barrier_async(<#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)
  • 线程组函数dispatch_group_t
// 创建线程组 
dispatch_group_create()
// 线程组异步执行
dispatch_group_async(<#dispatch_group_t  _Nonnull group#>, <#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)
// 线程组所有函数执行完毕之后将会调用该函数
dispatch_group_notify(<#dispatch_group_t  _Nonnull group#>, <#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)
//进组和出组函数 成对出现 可使用这俩函数建立任务之间的依赖关系
dispatch_group_enter(<#dispatch_group_t  _Nonnull group#>)
dispatch_group_leave(<#dispatch_group_t  _Nonnull group#>)
  • 延时函数dispatch_after
  • 可以用该函数做一些延时任务
dispatch_after(<#dispatch_time_t when#>, <#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)
  • 一次执行函数dispatch_once
  • 代码块内的操作只会执行一次,常在创建单利的时候使用
dispatch_once(<#dispatch_once_t * _Nonnull predicate#>, <#^(void)block#>)
  • source函数 dispatch_source_t
  • 常用于实现定时器的功能,精准度高于NSTimer(具体实现可参考 dispatch_source_t详解
// 创建
dispatch_source_create(<#dispatch_source_type_t  _Nonnull type#>, <#uintptr_t handle#>, <#uintptr_t mask#>, <#dispatch_queue_t  _Nullable queue#>)
// 回调函数
dispatch_source_set_event_handler(<#dispatch_source_t  _Nonnull source#>, <#^(void)handler#>)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,548评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,497评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,990评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,618评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,618评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,246评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,819评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,725评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,268评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,356评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,488评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,181评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,862评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,331评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,445评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,897评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,500评论 2 359

推荐阅读更多精彩内容