dispatch_async 详解

iOS多线程——GCD底层探索中(dispatch_async与dispatch_sync源码) 准备工作以及源码的下载在上一篇文章中 并发函数 dispatch_async 查看源码 dispatch_async(dispatch_queue_t // dq为队列,work为任务 void dispatch_async(dispatch_queue_t dq, dispatch_block_t work) { // 临时变量,参数 dispatch_continuation_t dc = _dispatch_continuation_alloc(); uintptr_t dc_flags = 阅读详情

dispatch_async 详解

说明

作用:在调度队列上提交异步执行的块,并立即返回。

函数原型:

void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

参数:

  1. queue:提交块的队列。系统保留队列,直到块运行完成。此参数不能为空。
  2. block:要提交给目标调度队列的块。此函数代表调用者执行Block_copy和Block_release。此参数不能为空。

此函数是将块提交到调度队列的基本机制。对此函数的调用总是在提交块后立即返回,并且从不等待调用块。目标队列确定该块是相对于提交给同一队列的其他块串行调用还是并发调用。独立的串行队列相互同时处理。

dispatch_async 函数会立即返回,block会在后台异步执行。

源码分析

void dispatch_async(dispatch_queue_t dq, void (^work)(void))
{
    dispatch_async_f(dq, _dispatch_Block_copy(work),
            _dispatch_call_block_and_release);
}
// 调用了下面的方法
void dispatch_async_f(dispatch_queue_t dq, void *ctxt, dispatch_function_t func)
{
    //1、定义一个封装的block操作
    dispatch_continuation_t dc;

    // No fastpath/slowpath hint because we simply don't know
    //2、dq_width == 1表示串行,就是main queue和用户创建的串行queue
    if (dq->dq_width == 1) {
        return dispatch_barrier_async_f(dq, ctxt, func);
    }

    //如果是global queue和用户创建的并行queue则继续向下走
    //3、线程中有个dispatch_continuation_t缓存链表,如果获取到就把链表的下一个设为缓存,相当于把第一个取出来了
    dc = fastpath(_dispatch_continuation_alloc_cacheonly());
    if (!dc) {
        //4、如果没有dispatch_continuation_t缓存在堆上创建一个,并且初始化后调用_dispatch_queue_push
        return _dispatch_async_f_slow(dq, ctxt, func);
    }
    //5、初始化dispatch_continuation_t,把block封装成dispatch_continuation_t
    dc->do_vtable = (void *)DISPATCH_OBJ_ASYNC_BIT;
    dc->dc_func = func;
    dc->dc_ctxt = ctxt;

    // No fastpath/slowpath hint because we simply don't know
    //6、如果do_targetq存在,则任务有do_targetq来执行
    if (dq->do_targetq) {
        return _dispatch_async_f2(dq, dc);
    }

    //7、把dispatch_continuation_t放到queue的执行列表中
    _dispatch_queue_push(dq, dc);
}
//dispatch_continuation_t的结构,封装的一个block操作
struct dispatch_continuation_s {
    const void *do_vtable;
    struct dispatch_continuation_s *volatile do_next;
    dispatch_function_t dc_func;
    void *dc_ctxt
    dispatch_group_t dc_group;
    void *dc_data[3];
};

通过上面的方法我们可以看出,dispatch_async_f 最终将 block 封装成 dispatch_continuation_s 并调用 _dispatch_queue_push 放到对应的 queue 的执行链表结尾,global queue 是放到自己的执行链表执行,main queue 和 user queue 放到 do_targetq 的执行链表执行。

dispatch_async(dispatch_get_main_queue(), ^{})

dispatch_async(异步)和 dispatch_sync(同步)决定有没有开子线程的能力,而不是指会不会开子线程。queue 决定有没有并发的能力。开子线程我就并发,不开就串行。

所以 dispatch_async(dispatch_get_main_queue(), ^{}) 的意思是异步地在主线程按顺序执行,没有开子线程的能力。

完整详解GCD系列(一)dispatch_async;dispatch_sync;dispatch_async_f;dispatch_sync_f 为什么要写这个系列,因为百度了一下,找了很多都是些片面的Blog,拷贝来拷贝去的,写的也很粗糙。没有一个完整的可参考系列 所以,我要写这个系列,尽量把官网文档中GCD的强大功能完整的表达出来。方便自己,也方便别人,如果发现有问题,欢迎提出 阅读详情

相关推荐

Titans:谷歌新型神经记忆架构,突破 Transformer 长序列处理的瓶颈

Titans 是谷歌推出的新型神经网络架构,通过神经长期记忆模块突破 Transformer 在处理长序列数据时的瓶颈,支持并行计算,显著提升训练效率。

士多啤梨先生の博客 990

iOS 多线程:『GCD』详尽总结

本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法。这大概是史上最详细、清晰的关于 GCD 的详细讲解+总结的文章了。通过本文,您将了解到:1. GCD 简介2. GCD 任务和队列3. GCD 的使用步骤4. GCD 的基本使用(6种不同组合区别)5. GCD 线程间的通信6. GCD 的其他方法(栅栏方法:dispatch_barrier_async、延时执行方法:dispatch_after、一次性代码(只执行一次):dispatch_once、快速迭代方法:dispatch_...

Globalizationa的博客 509

Fiddler everywhere的一些基础操作

网上能搜到的Fiddler everywhere使用教程太少,于是我整理了一些自己实操成功的内容,包括Fiddler everywhere的Mock测试、弱网测试等基础操作,后续还会持续更新。操作系统:macOS使用工具:Fiddler everywhere 5.10.0本文简单介绍了使用Fiddler everywhere进行的Mock测试和弱网测试,而Fiddler everywhere提供了更多的其他实用的功能,我会在后期进行一个持续的学习和更新。

weixin_44346646的博客 2478

iOS的同步异步,串行并行

iOS中的异步和同步: dispatch_async(异步)和dispatch_sync(同步): 决定有没有开子线程的能力,而不是指会不会开子线程。queue 决定有没有并发的能力。开子线程我就并发,不开就串行。 dispatch_async(异步)有开子线程能力。 dispatch_sync(同步)没有开子线程能力。 1.dispatch_async各种搭配后代码块中代码在什么线程中,怎样执行? 1):dispatch_get_main_queue 都在主线程中按顺序执行(比较特殊);

程序猿老樊的博客 2018

R语言实战:GEO单细胞数据下载与自动化整理全流程(附代码)

本文详细介绍了使用R语言从GEO数据库下载scRNA-seq数据并实现自动化整理的完整流程。通过GEOquery和Seurat等工具包,读者可以高效获取单细胞RNA测序数据,完成从原始数据下载到预处理的全过程,最终生成可直接用于分析的Seurat对象。文章包含完整代码示例,特别适合生物信息学研究者处理单细胞数据。

weixin_29061821的博客 425

synopsys工具安装系列(一)安装installer

synopsys为eda工具安装,提供了一个安装器,名叫installer。所以,首先要先安装installer这个工具,之后才能安装其他的eda工具。 首先从官网下载该installer工具。我这里下载的是5.2版本 下载之后,有如下安装文件。 将该安装包,拷贝到linux服务器中。 首先给SynopsysInstaller_v5.2.run赋予可执行权限。 chmod a+x SynopsysInstaller_...

weiqi7777的博客 8388

常用的方法几个dispatch_async方法

为了避免界面在处理耗时的操作时卡死,比如读取网络数据,IO,数据库读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面。 用GCD实现这个流程的操作比前面介绍的NSThread NSOperation的方法都要简单。

Holothurian 5642

EG800K 4G模块AT指令避坑指南:让你的STM32物联网项目稳定连接云端

本文详细解析了EG800K 4G模块在STM32物联网项目中的AT指令应用避坑指南,涵盖从底层协议到云端稳定的全链路优化策略。通过实战案例和防护机制,帮助开发者解决常见通信陷阱,提升云端通信的稳定性和效率。

weixin_26834815的博客 288

GCD源码吐血分析(2)——dispatch_async/dispatch_sync/dispatch_once/dispatch group

上一章中,我们知道了获取GCD queue的底层实现。获取到queue后,就需要将任务提交到queue中进行处理。 我们有两种方式提交任务: dispatch_async和dispatch_sync。一个是异步不等待任务完成就返回,另一个是同步任务,需要等待任务完成。这两种提交任务的方式有所不同: dispatch_async :底层运用了线程池,会在和当前线程不同的线程上处理任务。 di...

无忘无往 8151

计算机三级考试嵌入式系统重点精简汇总

第一章 嵌入式系统概论 1.1.1嵌入式系统 (1)特点:(1)专用性;(2)隐蔽性;(3)资源受限;(4)高可靠性;(5)实时性;(6)软件固化。 (2)应用:(1)冰箱、洗衣机、电饭煲、空调、摄影机、DVD播放器等;(2)数控机床、飞机、汽车、电梯、X光机、血压计等;(3)电话机、传真机、打印机、pos机、GPS导航仪、路由器等。 1.1.2嵌入式系统组成与分类 (1)逻辑组成:硬件和软件,分为处理器、存储器、I|0设备与I|O接口,数据总线; (2)处理器:分为主处理器(CPU)和协处

chemkrik的博客 1万+

用业务语义织就企业数据之网:SAP Datasphere 的定位、架构与落地场景全解析

SAP Datasphere作为SAP业务数据云的核心组件,通过语义层整合企业内外部数据,支持实时分析与AI应用。其核心功能包括数据集成、语义建模、虚拟化与仓库能力,通过Spaces实现资源隔离,Data Builder和Business Builder分别面向技术和业务建模。该平台与SAP HANA Cloud、SAC等深度集成,支持财务统一分析、供应链可视化等典型场景,并可通过BW bridge实现传统BW资产云化迁移。Datasphere强调开放互联,能与Databricks等生态伙伴协同,为企业提供

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1360

dispatch_async_f 详解

之前面试的时候被问过一个问题:你知道dispatch_async_f 吗?我一脸蒙比,问题好变态,太偏了吧,见过但是没用过,不知道干啥的。。今天一时兴起,想了解一下,下面是参数的官方文档: context: The application-defined context parameter to pass to the function.         work:      The appl

gaoyuqiang30的博客 2805

LSTM+Transformer混合模型时间序列预测实战教学

LSTM+Transformer混合模型时间序列预测实战教学 毕业设计

8218

dispatch_barrier_GCD学习之dispatch_barrier_async详解

dispatch_barrier_async在访问数据库或文件时,使用Serial Dispatch Queue可避免数据竞争的问题。写入处理确实不可与其他的写入处理以及包含读取处理的其他某些问题并行执行。但是如果读取处理只是与读取处理并行执行,那么多个并行执行就不会发生问题。为了高效率地进行访问,读取处理追加到Concurrent Dispatch Queue中,写入处理在任一个读取处理没有执行...

weixin_36180471的博客 2014

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

dispatch_group_async 使用详解

dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。下面是一段例子代码: [cpp] dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ...

weixin_33851604的博客 781

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

完整详解GCD系列(一)dispatch_async;dispatch_sync;dispatch_

为什么要写这个系列,因为百度了一下,找了很多都是些片面的Blog,拷贝来拷贝去的,写的也很粗糙。 所以,我要写这个系列,尽量把官网文档中GCD的强大功能完整的表达出来。方便自己,也方便别人,如果发现有问题,欢迎提出 本教程的计划:在完整的看过GCD的官方文档之后,我实在想不出来如何用一...

chunqingtai2922的博客 264

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

完整详解 swift GCD系列(一)dispatch_async;dispatch_sync;dispatch_async_f;dispatch_sync_f

为什么要写这个系列,因为百度了一下,找了很多都是些片面的Blog,拷贝来拷贝去的,写的也很粗糙。 所以,我要写这个系列,尽量把官网文档中GCD的强大功能完整的表达出来。方便自己,也方便别人,如果发现有问题,欢迎提出 本教程的计划:在完整的看过GCD的官方文档之后,我实在想不出来如何用一篇文章详细完整的写出来如此多的功能。 所以,决定开一个专栏来写这个教程。计划8篇文章,分别介

ruglcc's blog 5258

iOS学习笔记74-完整详解GCD系列(一)dispatch_async;dispatch_sync;dispatch_async_f;dispatch_sync_f

为什么要写这个系列,因为百度了一下,找了很多都是些片面的Blog,拷贝来拷贝去的,写的也很粗糙。 所以,我要写这个系列,尽量把官网文档中GCD的强大功能完整的表达出来。方便自己,也方便别人,如果发现有问题,欢迎提出 本教程的计划:在完整的看过GCD的官方文档之后,我实在想不出来如何用一篇文章详细完整的写出来如此多的功能。 所以,决定开一个专栏来写这个教程。计划8篇文章,分别介

探路者_iOS 1308

dispatch_sync和dispatch_async的区别

dispatch_sync 线程同步、dispatch_async线程异步 比如 //同步 dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"dispatch_sync - 1"); }); dispa...

鸿鹄当高远 372

dispatch_async & dispatch_sync

博客搬家咯~http://joeleee.github.io/ 博客搬家咯~http://joeleee.github.io/ 博客搬家咯~http://joeleee.github.io/ Clear that! dispatch_async 是将block发送到指定线程去执行,当前线程不会等待,会继续向下执行。 dispatch_sync 也是将block发送到指定...

weixin_30685047的博客 256

GCD 异步编程实战:dispatch_async 与 dispatch_sync 的完整使用教程

Grand Central Dispatch(GCD)是 libdispatch 项目提供的强大并发编程框架,通过优化线程管理和任务调度,帮助开发者充分利用多核硬件性能。作为苹果生态系统的核心组件,GCD 提供了简洁高效的 API 来处理异步任务,其中 **dispatch_async** 和 **dispatch_sync** 是最基础也最常用的两个函数。本文将通过实例详解这两个函数的使用场景、

gitblog_00514的博客 460

dispatch_async

dispatch_asyncSubmits a block for asynchronous(异步) execution on a dispatch queue and returns immediately.block提交后立马调用这一功能,不会等block被唤醒 声明 void dispatch_async( dispatch_queue_t queue, dispatch_block_t

onebutterfly 575
上一篇: ViewController 的常用跳转及返回方法
下一篇: Leetcode3190. 使所有元素都可以被 3 整除的最少操作数
UestcXiye
博客等级 码龄8年 9027粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值