多线程之GCD(一)

简介: Grand Central Dispatch简称(GCD)是由苹果公司开发的技术,是一个非常好的用于多核设备的解决方案。GCD核心在于两个概念: 队列:队列负责管理开发者提交的任务,GCD队列始终以FIFO(先进先出)的方式来处理任务-----但由于处理执行的时间不同,所以先处理的任务并不一定先结束。

Grand Central Dispatch简称(GCD)是由苹果公司开发的技术,是一个非常好的用于多核设备的解决方案。GCD核心在于两个概念:

     队列:队列负责管理开发者提交的任务,GCD队列始终以FIFO(先进先出)的方式来处理任务-----但由于处理执行的时间不同,所以先处理的任务并不一定先结束。队列既可以是串行队列,也可以是并发队列,串行队列每次只处理一个任务,必须前一个任务执行完成后,才能执行下一个任务;并发队列则可同时处理多个任务,因此可以多个任务并发处理。
    队列底层会维护一个线程池来处理用户提交任务,线程池的作用是执行队列管理的任务。串行队列底层的线程池只是维护一个线程即可,并发队列则需要维护多个线程。

    任务:任务就是用户提交给队列的工作单元,这些任务将会给队列底层维护的线程池执行,这些任务会以多线程的方式执行。

使用GCD遵守两个步骤:
1.创建队列。
2.将任务提交给队列。

创建队列:
-》串行队列:串行队列底层的线程池只要一个线程,因此只提供一个线程来执行任务,所以后一个任务必须等到前一个任务执行结束才能开始执行。
-》并发执行:线程池提供多个线程来执行任务,所以可以按FIFO的顺序并发启动、执行多个任务。
(1)获取系统默认的全局并发队列
获取系统默认的全局并发队列:
dispatch_queue_t queue =dispatch_get_global_queue(
DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
(2)获取系统主线程关联的串行队列
获取系统主线程关联的串行队列:
dispatch_queue_t queue =dispatch_get_main_queue();就相当于直接在程序主线程中执行任务。
(3)创建串行队列
创建串行队列:
dispatch_queue_t queue =dispatch_queue_create(“ios.queue”,DISPATCH_QUEUE_SERIAL);
如果将多任务提交给串行队列,多任务只能一个一个按顺序执行。
(4)创建并发队列
创建并发队列:
dispatch_queue_t queue =dispatch_queue_create(“ios.queue”,DISPATCH_QUEUE_CONCURRENT);
如果将多个任务提交给并发队列,可以按FIFO的顺序启动多个并发执行任务。
得到队列之后,就可以将任务提交给队列,并由队列底层管理的线程池来执行任务。

提交任务
向队列提交任务:
void dispatch_async(dispatch_queue_t queue,dispatch_block_t block):
将代码块以异步方式提交给指定队列
void dispatch_async_f(dispatch_queue_t queue,void *context,dispatch_function_t work):
将函数以异步方式提交给指定队列
void dispatch_sync(dispatch_queue_t queue,dispatch_block_t block):
将代码块以同步方式提交给指定队列
void dispatch_sync_f(dispatch_queue_t queue,void *context,dispatch_function_t block):
将函数以同步方式提交给指定队列
void dispatch_after(dispatch_time_t when,dispatch_queue_t queue,dispatch_block_t block):
将代码块以异步方式提交给指定队列,该队列底层的线程池将负责在when指定的时间执行该代码块。
void dispatch_after_f(dispatch_time_t when,dispatch_queue_t queue,void *context,dispatch_function_t work):
将函数以异步方式提交给指定队列,该队列底层的线程池将负责在when指定的时间执行该函数。
void dispatch_apply(size_t iterations,dispatch_queue_t queue,void(^block)(size_t)):
将代码块以异步方式提交给指定队列,该队列底层的线程池将会多次重复执行代码块。
void dispatch_apply(size_t iterations,dispatch_queue_t queue,void context,void(*work)(void ,size_t)):
将函数以异步方式提交给指定队列,该队列底层的线程池将会多次重复执行函数。
void dispatch_once(dispatch_once_t *predicate,dispatch_block_t block):
将代码块提交给指定队列,该队列底层的线程池控制在应用的某个生命周期内仅执行该函数一次。其中predicate参数是一个指向dispatch_once_t(本质就是long型整数)变量的指针,该变量用于判断该代码块是否已经执行过。

相关文章
|
6月前
|
API 调度 iOS开发
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
71 1
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
936 1
|
网络性能优化 API 调度
36 Swift多线程编程新思路:GCD
Swift多线程编程新思路:GCD
102 0
|
iOS开发
iOS中的多线程与GCD队列关系
iOS中的多线程与GCD队列关系
182 0
iOS中的多线程与GCD队列关系
|
缓存 程序员 调度
iOS开发多线程篇-GCD
上篇文章介绍了多线程是什么、线程的进程的区别,在这篇文章中,主要介绍iOS开发中多线程GCD的使用方式和注意事项,同时会给出几种多线程的案例。
|
数据库 iOS开发
ios多线程-GCD基本用法
ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法
|
安全 iOS开发
iOS多线程开发之深入GCD
iOS多线程开发之深入GCD
106 0
iOS多线程开发之深入GCD
|
调度 C语言 iOS开发
iOS多线程编程之三——GCD的应用(二)
iOS多线程编程之三——GCD的应用
147 0
iOS多线程编程之三——GCD的应用(二)
|
调度 C语言 iOS开发
iOS多线程编程之三——GCD的应用(一)
iOS多线程编程之三——GCD的应用
139 0
iOS多线程编程之三——GCD的应用(一)
GCD处理多线程同步操作 韩俊强的博客
原文地址: http://blog.csdn.net/qq_31810357/article/details/78906308 未经许可,严禁转载! GCD使用 dispatch_group_notify、dispatch_group_enter、dispatch_group_leave处理多线程同步操作 一、简介 dispatch_group_enter:通知group,下面的任务马上要放到group中执行。
1154 0