GCD索引(Grand Central Dispatch (GCD) Reference )

本文介绍GCD(Grand Central Dispatch)如何支持iOS和OS X多核硬件上的并发代码执行。GCD提供三种队列:主线程队列、并行队列和串行队列,以及调度组、信号和屏障等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GCD包括语言特性、运行库和系统改进,提供系统的、全面的改进并支持在iOSOS X多核硬件上执行并发代码。

BSD子系统,CoreFoundationCocoa接口已扩展,利用这些改进可以使系统和应用运行更快、更有效率以及改进的响应。考虑到单个应用有效的使用多核的困难,更不用说在有不同数目计算核心的电脑上或多个应用程序争抢这些核心的环境上完成。GCD是操作在系统层面上。可以更好的满足正在运行的所有应用程序的需要,以平衡的方式满足他们可用的系统资源。

本文档描述了GCD接口,它支持在Unix系统上异步执行操作。可以利用这个接口来管理与文件描述符、Mach端口、信号或计时器的交互。在OS X v10.7和更高级版本,可以利用GCD来处理通用异步I/O文件描述符操作。

GCD并不局限于系统级应用程序,但是在更高级应用程序中使用它之前,必须考虑在Cocoa中(通过NSOperationblock对象)是否提供类似的功能更容易使用或者更加适合你的需求。更多信息,可以查看并发编程指南。

重要提示

当分支系统调用和GCD一起时必须小心。如果一个程序中在调用分支之前调用GCD,直到成功调用执行程序或相关功能,才能安全的在生成的子进程中调用额外的GCD

GCD对象和自动引用计数

当使用Object-C编译器构建应用程序时,所有调度对象都是Object-C对象。因此,当启动自动引用计数器(ARC)时,调度对象像其他Object-C对象一样保留和自动释放。当不启用ARC时,使用dispatch_retaindispatch_release函数(或Objective-C语法)来保留和释放调度对象。不能使用核心框架中的retain/release函数。

如果需要在支持ARC的应用中使用retain/release语法来部署目标(维护现有代码的兼容性),可以通过在编译器标志中添加 -DOS_OBJECT_USE_OBJC=0来禁用基于Objective-C的调度对象。

函数

创建和管理队列

dispatch_get_main_queue

dispatch_get_global_queue

dispatch_queue_create

dispatch_get_current_queue (iOS 6.0)

dispatch_queue_attr_make_with_qos_class

dispatch_queue_get_label

dispatch_set_target_queue

dispatch_main

排队任务的调度

GCD提供并管理先进先出队列,应用程序可以以block对象的形式提交任务。提交到调度队列中的block在线程池里运行,该线程池完全由系统管理。不能保证任务在某个线程上执行。GCD提供了三种队列:

l 主线程:在应用程序的主线程上任务串行执行

l 并行:任务按照先进先出的顺序出队,但任务可以并行允许,可以按照任何顺序完成

l 串行:按照先进先出的顺序一次执行一个任务

主队列是由系统自动创建并且和应用程序主线程相关联。应用程序使用以下三种方法中的一种(只能一种)来调用提交到主线程的block

l 调用dispatch_main

l 调用UIApplicationMain (iOS) 或 NSApplicationMain (OS X)

l 在主线程中使用CFRunLoopRef

可以使用并发队列来执行大量的并发任务。GCD会自动创建是个并发调度队列(在iOS5OS X v10.7之前是三个),这些队列是全局的,应用程序只能通过他们的优先级进行区分。应用程序请求队列可以使用dispatch_get_global_queue函数。因为这些并发队列是全局的,不需要保留和释放他们,就算调用了retainrelease也会被忽略。在OS X v10.7 与其之后版本和iOS 4.3与其之后版本,可以在代码模块中创建额外的并发队列。

使用串行队列保证任务按照可预测的顺序执行。它可以识别每个串行队列的特殊目的,如资源保护换关键程序的同步。应用程序必须显式地创建和管理串行队列。如果需要可以创建更多队列,但在并行队列中尽量避免使用。

重要提示

GCD是一个C语言的API,它不捕获来自更高级语言的异常。应用程序必须在提交到调度队列的block返回之前,捕获所有异常。

dispatch_async

dispatch_async_f

dispatch_sync

dispatch_sync_f

dispatch_after

dispatch_after_f

dispatch_apply

dispatch_apply_f

dispatch_once

dispatch_once_f

使用调度组

组合block使聚合同步成为可能。应用程序可以提交多个block,在它们完成时跟踪,即使它们可能运行在不同的队列。当遇到特定任务完成后程序才能执行的情况时,这种行为很有用。

dispatch_group_async

dispatch_group_async_f

dispatch_group_create

dispatch_group_enter

dispatch_group_leave

dispatch_group_notify

dispatch_group_notify_f

dispatch_group_wait

管理调度对象

GCD提供调度对象接口,允许应用程序管理这方面的进程,例如内存管理、暂停和回复执行、定义对象内容以及记录任务数据。调度对象必须手动retainrelease而不是靠垃圾回收。

dispatch_debug (iOS 6.0)

dispatch_get_context

dispatch_release

dispatch_resume

dispatch_retain

dispatch_set_context

dispatch_set_finalizer_f

dispatch_suspend

使用信号

调度信号是一种有效的传统计数信号。只有当需要阻塞调用线程时,调度信号才调用到内核。如果不需要阻塞调用信号,则不需要调用内核。

dispatch_semaphore_create

dispatch_semaphore_signal

dispatch_semaphore_wait

使用屏障?

调度屏障允许在并发调度队列中创建一个同步点。当遇到屏障,并发队列延迟屏障block(或其他block)直到所有的block在屏障完成执行前提交完。在这个点上,屏障block执行。完成后,队列继续其他正常的执行行为。

dispatch_barrier_async

dispatch_barrier_async_f

dispatch_barrier_sync

dispatch_barrier_sync_f

管理调度资源

GCD提供一套调度资源接口用来监听(低级系统对象例如Unix描述符、Mach端口、Unix信号、VFS节点等)活动。当此类活动发生时,并提交时间处理程序到调度队列。当事件发生时,调度资源异步提交任务代码到指定的调度队列进行处理。

dispatch_source_cancel

dispatch_source_create

dispatch_source_get_data

dispatch_source_get_handle

dispatch_source_get_mask

dispatch_source_merge_data

dispatch_source_set_registration_handler

dispatch_source_set_registration_handler_f

dispatch_source_set_cancel_handler

dispatch_source_set_cancel_handler_f

dispatch_source_set_event_handler

dispatch_source_set_event_handler_f

dispatch_source_set_timer

dispatch_source_testcancel

使用调度I/O便利?(Convenience)API

调度I/O 便利?API允许对文件描述符执行异步读写操作。这个API支持基于流访问文件描述符内容。

dispatch_read

dispatch_write

使用调度I/O通道?(Channel)API

利用调度I/O通道API可以管理基于文件描述符的操作。这个API支持基于流和随机访问语法来访问文件描述符的内容。

dispatch_io_create

dispatch_io_create_with_path

dispatch_io_create_with_io

dispatch_io_read

dispatch_io_write

dispatch_io_close

dispatch_io_barrier

dispatch_io_set_high_water

dispatch_io_set_low_water

dispatch_io_set_interval

dispatch_io_get_descriptor

管理调度数据对象

调度数据对象提供一个接口来管理基于内存的数据缓冲区。客户端访问数据缓冲区时将它看做一个连续的内存块,但缓冲区在内部可能由多个不连续的内存块组成。

dispatch_data_create

dispatch_data_get_size

dispatch_data_create_map

dispatch_data_create_concat

dispatch_data_create_subrange

dispatch_data_apply

dispatch_data_copy_region

管理时间

dispatch_time

dispatch_walltime

管理特定队列数据

dispatch_queue_set_specific

dispatch_queue_get_specific

dispatch_get_specific

数据类型

dispatch_block_t

dispatch_function_t

dispatch_group_t

dispatch_object_t

dispatch_once_t

dispatch_queue_t

dispatch_time_t

dispatch_source_type_t

dispatch_fd_t

dispatch_data_t

dispatch_data_applier_t

dispatch_io_t

dispatch_io_handler_t

dispatch_io_type_t

dispatch_io_close_flags_t

dispatch_io_interval_flags_t

常量

dispatch_queue_priority_t

dispatch_source_mach_send_flags_t

dispatch_source_proc_flags_t

dispatch_source_vnode_flags_t

dispatch_source_memorypressure_flags_t

Data Object Constants

Data Destructor Constants

Dispatch Queue Types

Dispatch Source Type Constants

Dispatch Time Constants

Time Multiplier Constants

Dispatch I/O Channel Types

Channel Closing Options

Channel Configuration Options


官方原文:

https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值