深入探讨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有所帮助。
推荐阅读
-
本文将深入探讨 iOS 中的 Grand Central Dispatch (GCD),并介绍如何利用 GCD 进行高效多线程编程。如果你对线程的基本概念还不熟悉,建议先阅读相关基础资料。 ...
[详细]
蜡笔小新 2024-11-14 15:57:40
-
本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ...
[详细]
蜡笔小新 2024-11-14 15:04:34
-
-
为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ...
[详细]
蜡笔小新 2024-11-13 12:14:35
-
本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ...
[详细]
蜡笔小新 2024-11-12 08:20:05
-
本文探讨了 TypeScript 中泛型的重要性和应用场景,通过多个实例详细解析了泛型如何提升代码的复用性和类型安全性。 ...
[详细]
蜡笔小新 2024-11-15 12:12:42
-
面试题总结_2019年全网最热门的123个Java并发面试题总结 ...
[详细]
蜡笔小新 2024-11-15 11:58:13
-
CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ...
[详细]
蜡笔小新 2024-11-15 11:52:38
-
本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ...
[详细]
蜡笔小新 2024-11-15 10:42:13
-
2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ...
[详细]
蜡笔小新 2024-11-14 12:11:09
-
我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ...
[详细]
蜡笔小新 2024-11-14 10:07:21
-
本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ...
[详细]
蜡笔小新 2024-11-13 15:40:34
-
PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ...
[详细]
蜡笔小新 2024-11-15 14:56:34
-
本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ...
[详细]
蜡笔小新 2024-11-15 00:19:42
-
蜡笔小新 2024-11-14 19:07:05
-
re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ...
[详细]
蜡笔小新 2024-11-14 15:52:38
-