多线程 - GCD

多线程 - 2

Grand Central DisPatch

dispatch queue

队列

 dispatch_queue_t

创建

dispatch_queue_t
dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);

使用

void
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

void
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

main dispatch queue

有且只有一个main dispatch queue
所有任务都在主线程中执行

Serial Queue

一个队列,一个线程。可以精确控制任务执行的顺序。但是并发性差。

Concurrent Queue

一个队列,多个线程。

内置dispatch queue

dispatch_queue_t
dispatch_get_global_queue(long identifier, unsigned long flags);

dispatch_after

void
dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);

线程安全

使用serial queue 的特性保证资源的线程安全

相比lock unlock

更安全:避免不对称的锁的调用
性能更好:避免大量计算在后台进行
更清晰:线程模型更清楚

死锁

dispatch_async(_queue, ^{
    dispatch_sync(_queue, ^{
        //do someing
    })
    
})
//main thread
dispatch_sync(_queue(),^{
    //do someing
});

//queue task
dispatch_sync(dispatch_get_main_queue(),^{
    //do someing
});

dispatch_once

在多线程中避免使用单例时产生两个对象。

屏幕快照 2017-07-18 上午12.22.26.png
屏幕快照 2017-07-18 上午12.25.25.png

dispatch_semaphore

控制dispatch_queue 并发数?

  • 计并发数为concurrent_count
  • concurent_count < 15
  • 有任务进来,concurrent_count++
  • 有任务完成,concurrent_count--
  • 对concurrent_count加锁

创建信号量

dispatch_semaphore_t
dispatch_semaphore_create(long value)

触发信号量

long
dispatch_semaphore_signal(dispatch_semaphore_t dsema);

等待信号量

long
dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);

dispatch_group

创建group

dispatch_group_t
dispatch_group_create(void);

给任务设置group

void
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block);

等待group完成

long
dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 最近颇花了一番功夫把多线程GCD人的一些用法总结出来,一来帮自己巩固一下知识、二来希望能帮到对这一块还迷茫...
    人活一世阅读 355评论 1 1
  • 目录 一、基本概念1.多线程2.串行和并行, 并发3.队列与任务4.同步与异步5.线程状态6.多线程方案 二、GC...
    BohrIsLay阅读 1,705评论 5 12
  • 一、简介在iOS所有实现多线程的方案中,GCD应该是最有魅力的,因为GCD本身是苹果公司为多核的并行运算提出的解决...
    MYS_iOS_8801阅读 599评论 0 0
  • #import "ViewController.h" @interface ViewController () @...
    艾克12138阅读 263评论 0 0
  • 目录:iOS多线程(一)--pthread、NSThreadiOS多线程(二)--GCD详解iOS多线程(三)--...
    Claire_wu阅读 1,137评论 0 6

友情链接更多精彩内容