深入探讨C++中的GCD函数与队列
作者:Carry_Jia | 来源:互联网 | 2024-11-16 14:59
在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(GrandCentralDispatch)在多线程开发中的应用,包括其函数和队列的实现细节。
### 一、前言
在iOS开发中,多线程技术是不可或缺的一部分,能够显著提升应用的性能。GCD(Grand Central Dispatch)作为多线程技术中最常用和最安全的一种,基于C/C++函数封装实现,为开发者提供了高效的线程管理方案。
### 二、GCD函数详解
#### 2.1 dispatch_sync(同步函数)
同步函数`dispatch_sync`用于在当前线程中同步执行任务。其底层实现通过调用`_dispatch_sync_f`函数来完成。具体实现如下:
```c
void dispatch_sync(dispatch_queue_t dq, dispatch_block_t work) {
uintptr_t dc_flags = DC_FLAG_BLOCK;
if (unlikely(_dispatch_block_has_private_data(work))) {
return _dispatch_sync_block_with_privdata(dq, work, dc_flags);
}
_dispatch_sync_f(dq, work, _dispatch_Block_invoke(work), dc_flags);
}
```
进一步深入,`_dispatch_sync_f`函数调用了`_dispatch_sync_f_inline`内联函数,最终通过`_dispatch_client_callout`执行任务。
#### 2.2 dispatch_async(异步函数)
异步函数`dispatch_async`用于在后台线程中异步执行任务。其底层实现通过调用`_dispatch_continuation_async`函数来完成。具体实现如下:
```c
dispatch_async(dispatch_queue_t dq, dispatch_block_t work) {
dispatch_continuation_t dc = _dispatch_continuation_alloc();
uintptr_t dc_flags = DC_FLAG_CONSUME;
dispatch_qos_t qos;
qos = _dispatch_continuation_init(dc, dq, work, 0, dc_flags);
_dispatch_continuation_async(dq, dc, qos, dc->dc_flags);
}
```
进一步深入,`_dispatch_continuation_async`函数调用了`_dispatch_trace_item_push`,最终通过宏定义`DISPATCH_INTROSPECTION_HOOK_CALLOUT`执行任务。
### 三、GCD队列详解
#### 3.1 串行队列
串行队列遵循FIFO(先进先出)原则,所有任务按顺序执行。在iOS开发中,可以通过`dispatch_queue_create`创建串行队列。例如:
```c
dispatch_queue_t serial = dispatch_queue_create("cooci", DISPATCH_QUEUE_SERIAL);
```
#### 3.2 并发队列
并发队列允许多个任务并行执行,通过时间片轮转的方式调度任务。在iOS开发中,可以通过`dispatch_queue_create`创建并发队列。例如:
```c
dispatch_queue_t cOnque= dispatch_queue_create("cooci", DISPATCH_QUEUE_CONCURRENT);
```
#### 3.3 队列的创建与关联
队列的创建通过`dispatch_queue_create`函数完成,该函数内部调用了`_dispatch_lane_create_with_target`。具体实现如下:
```c
dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr) {
return _dispatch_lane_create_with_target(label, attr, DISPATCH_TARGET_QUEUE_DEFAULT, true);
}
```
进一步深入,`_dispatch_lane_create_with_target`函数根据传入的属性创建不同类型的队列,并关联相应的类信息。
### 四、总结
本文详细介绍了GCD在多线程开发中的应用,包括同步和异步函数的实现细节,以及串行和并发队列的创建与管理。希望对读者在iOS开发中使用GCD有所帮助。
推荐阅读
-
BFS深搜hashtable来判断是横线还是竖线但是为啥还是90分啊呜呜!找不到原因#define_CRT_SECURE_NO_WARNINGS1#include ...
[详细]
蜡笔小新 2024-12-16 23:00:20
-
本文介绍了一道来自《紫书》的编程题目——UVa11212 编辑书稿。该问题通过迭代加深搜索(IDA*)算法解决,旨在找到将给定排列转换为升序排列所需的最少步骤。文章提供了详细的解题思路和代码实现。 ...
[详细]
蜡笔小新 2024-12-16 17:28:35
-
-
本文探讨了C++编程语言中声明与定义的区别,以及如何通过内部连接和外部连接来组织源文件,确保代码的正确链接与编译。文章详细解析了不同类型、变量、函数以及类的连接属性,并提供了实用的示例。 ...
[详细]
蜡笔小新 2024-12-16 16:56:53
-
本文介绍了如何在MATLAB中实现单变量线性回归,这是基于Coursera上Andrew Ng教授的机器学习课程中的一个实践项目。文章详细讲解了从数据可视化到模型训练的每一个步骤。 ...
[详细]
蜡笔小新 2024-12-16 09:46:38
-
本文探讨了如何通过R语言对给定数据集执行混合效应模型分析,进而计算出最小二乘均值(LSMEANS)并使用字母标注法来直观展示不同处理组间的显著性差异。 ...
[详细]
蜡笔小新 2024-12-14 15:47:01
-
题目概述:给定一棵带颜色节点的树,目标是找到一种方法,通过删除某些边使得每个连通分量内的节点颜色相同。需要计算出所有可能的合法边集的数量。使用动态规划的方法,特别是树形DP来解决问题。 ...
[详细]
蜡笔小新 2024-12-14 13:06:17
-
2017年苹果全球开发者大会即将开幕,预计iOS将迎来重大更新,同时Siri智能音箱有望首次亮相,AI技术成为大会焦点。 ...
[详细]
蜡笔小新 2024-12-18 18:02:27
-
本文详细介绍了如何安全有效地更新华硕主板的BIOS,包括准备工作、具体步骤以及注意事项。BIOS是计算机基本输入输出系统的关键组成部分,负责初始化硬件并加载操作系统,定期更新BIOS可以增强系统的稳定性和兼容性。 ...
[详细]
蜡笔小新 2024-12-18 15:17:55
-
本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ...
[详细]
蜡笔小新 2024-12-17 18:59:28
-
本文详细介绍了如何使用TWEN-ASR ONE开发板运行第一个语音识别程序,包括开发环境搭建、代码编写、下载和调试等步骤。 ...
[详细]
蜡笔小新 2024-12-17 11:03:50
-
本文介绍了在Windows 7操作系统中设置电脑自动启动的步骤,包括通过BIOS设置来电启动以及使用任务计划程序实现定时开机的功能。此外,还提供了通过键盘、鼠标和网络唤醒等方式实现自动开机的多种方法。 ...
[详细]
蜡笔小新 2024-12-16 15:22:03
-
Imreadingthisdocument:http:software.intel.comen-usarticlesinteractive-ray-tracing我正在阅读这个文 ...
[详细]
蜡笔小新 2024-12-16 14:16:21
-
本文通过探讨React中Context的使用,解决了在多层级组件间传递状态的难题。我们将详细介绍Context的工作原理,并通过实际案例演示其在项目中的具体应用。 ...
[详细]
蜡笔小新 2024-12-15 15:31:22
-
本文探讨了在渗透测试中信息收集阶段使用的几种端口扫描技术,包括nmap、masscan、socket、telnet及nc等工具的应用与比较。 ...
[详细]
蜡笔小新 2024-12-15 13:14:17
-
本文旨在介绍在iOS平台进行直播技术开发前的准备工作,重点讲解AVFoundation框架的基本概念和使用方法。通过对AVFoundation的深入理解,开发者能够更好地掌握直播应用中的音视频处理技巧。 ...
[详细]
蜡笔小新 2024-12-14 17:07:19
-