dispatch_barrier_async

GCD学习之dispatch_barrier_async dispatch_barrier_async 在访问数据库或文件时,使用Serial Dispatch Queue可避免数据竞争的问题。 写入处理确实不可与其他的写入处理以及包含读取处理的其他某些问题并行执行。但是如果读取处理只是与读取处理并行执行,那么多个并行执行就不会发生问题。 为了高效率地进行访问,读取处理追加到Concurrent Dispatch Queue中,写入处理在 阅读详情
//写入处理不可以与写入处理和读取处理并行执行。读取处理与读取处理可并行执行
//为了高效率的进行访问:
//读取处理追加到Concurrent Dispatch Queue中,写入处理在任一个读取处理没有执行的状态下,追加到Serial Dispatch Queue中即可,在写入处理结束之前,读取处理不可执行。
//通过dispatch_barrier_async也可实现
dispatch_queue_t queue = dispatch_queue_create("Dispatch Queue的名称", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{/*读取处理0*/});
dispatch_async(queue, ^{/*读取处理1*/});
dispatch_async(queue, ^{/*读取处理2*/});
dispatch_async(queue, ^{/*读取处理3*/});
//写入处理,之后会对写入的内容进行读取处理
//若简单的在dispatch_async函数中加入写入处理,那么根据Concurrent Dispatch Queue的性质,就有可能在追加到写入处理前面的处理中读取到与期待不符的数据,还可能因非法访问导致应用程序异常结束。如果追加多个写入处理,则可能发生更多问题,比如数据竞争。
//通过dispatch_barrier_async函数会等待追加到Concurrent Dispatch Queue上的并行执行的处理全部结束之后,再将指定的处理(异步)追加到该Concurrent Dispatch Queue中。然后在由dispatch_barrier_async函数追加的处理执行完毕后,Concurrent Dispatch Queue才恢复为一般的动作,追加到该Concurrent Dispatch Queue的处理又开始并行执行。
dispatch_barrier_async(queue, ^{/*写入处理*/});
dispatch_async(queue, ^{/*读取处理4*/});
dispatch_async(queue, ^{/*读取处理5*/});
dispatch_async(queue, ^{/*读取处理6*/});
dispatch_async(queue, ^{/*读取处理7*/});
//dispatch_barrier_sync函数与dispatch_barrier_async不同的地方是它会将指定的block同步追加到Concurrent Dispatch Queue中。在追加Block结束之前,dispatch_barrier_sync函数会一直等待。即dispatch_barrier_async不阻塞当前线程,dispatch_barrier_sync阻塞当前线程。

dispatch_barrier_(a)sync 异步和同步的栅栏函数都有以下特点: 1、通过dispatch_barrier_(a)sync添加的block会等待前边所有的block执行完(不包括回调)才执行。 2、在其后添加的block会在dispatch_barrier_(a)sync添加的block执行完之后(不包括回调)再执行; 不同点: 1、dispatch_barrier_sync:同步栅栏函数在原线程中执行block,不开辟新线程;在将任务插入到queue的时候,       dispatch_barrier_sync需要等待自己的任务结束之后才会继续程序,然后插入被写在它后面的任务。 2、dispatch_barrier_async:异步栅栏函数会开辟新线程执行block;ispatch_barrier_async将自己的任务插入到queue之后,不会等待自己的任务结束,它会继续把后面的任务插入到queue。 立即下载

相关推荐

快手极速版抓包实战:安卓/iOS双端获取client_salt全流程解析(避坑指南)

本文详细解析了在安卓和iOS平台上获取快手极速版关键参数`client_salt`的全流程,包括环境配置、抓包工具使用、参数识别与转换等实战技巧。特别针对双端差异和反抓包机制提供了避坑指南,帮助开发者高效安全地完成数据获取任务。

weixin_29021195的博客 714

【iOS】GCD深入学习

本篇主要介绍GCD中的方法。

m0_63852285的博客 1325

快速上手springboot+vue的前后端分离项目

使用webStorm新建项目后,把 .lock文件删除后项目运行才不报错,配置文件 vue.config.js 中加入 lintOnSave: false 关闭eslint语法检测。在多层嵌套的父子组件之间传递状态已经十分麻烦,而Vue更是没有为兄弟组件提供直接共享数据的办法。基于这个问题,许多框架提供了解决方案——使用全局的状态管理器,将所有分散的共享数据交由状态管理器保管,Vue也不例外。其中一种解决CORS 的方法, 在springboot项目中跨域的方法或类加上@CrossOrigin注解。

m0_61950264的博客 1905

iOS多线程---GCD中的栅栏函数

一、什么是栅栏函数 dispatch_barrier_async函数,在进程管理中起到一个栅栏的作用,它等待所有位于barrier函数之前的操作执行完毕后执行,并且在barrier函数执行之后,barrier函数之后的操作才会得到执行,该函数需要同dispatch_queue_create函数生成的DISPATCH_QUEUE_CONCURRENT队列一起使用。

旭日的博客 1680

Python实战:基于PyG和Stable-Baselines3复现柔性车间调度算法(附数据集)

本文提供了一份基于图神经网络与深度强化学习的柔性车间调度实战指南。通过PyTorch Geometric构建异构图表示车间状态,并利用Stable-Baselines3中的PPO算法训练调度智能体,详细介绍了从环境建模、网络设计到训练评估的完整代码实现,帮助开发者构建可复用的工业级智能调度系统。

ansible6ops的博客 608

机器人系统能用MQTT5.0代替ROS2吗?

更为灵活和友好的方案是通过把ROS(Robot Operating System)与MQTT(Message Queuing Telemetry Transport)协议相结合的解决方案,利用MQTT的轻量级、跨平台和广泛适用性特点,扩展ROS系统的通信能力,或将非ROS系统接入ROS网络。

QzmAIoT 2163

并发编程 - GCD的栅栏(dispatch_barrier_async)

在本文中,我们深入探讨了GCD栅栏操作的高级用法,通过实际示例展示了如何在并发队列中执行任务的顺序控制和实现读写锁。栅栏操作是处理复杂并发任务时非常强大的工具,它能够确保任务的顺序执行,避免数据不一致或冲突。然而,在使用栅栏操作时,需要特别注意一些关键点。首先,尽量避免在全局并发队列中使用栅栏操作,因为全局并发队列通常用于系统级任务。栅栏操作的使用应局限于专门为特定任务创建的并发队列,这样可以更好地控制执行任务的顺序。

weixin_39339407的博客 1301

快手NS sig3签名算法(2025年1月)

快手NS sig3签名算法(2025年1月)

sh_moranliunian的博客 3670

GCD全解-dispatch_barrier_sync/async-栅栏函数

文章目录1、前言2、同步栅栏函数:dispatch_barrier_sync2、异步栅栏函数:dispatch_barrier_async4、总结分析5、栅栏函数 与 自定义并发队列 1、前言 需求:假设有4个任务{1,2,3,4},执行完前2个再执行后2个 这里我们用到栅栏函数dispatch_barrier_(a)sync,(也可以用队列组),我们要注意的是不能使用全局并发队列(系统提供给我们的)否则会散失栅栏函数的意义。 # 栅栏函数仅与并发队列(DISPATCH_QUEUE_CONCURRENT)中

chenzimin_blog 1515

【FPGA教程案例87】加解密1——基于FPGA的AES加解密算法verilog实现

DES已走到了它生命的尽头。56比特密钥实在太小,虽然三重DES可以解决密钥长度的问题,但是DES的设计主要针对硬件实现,而今在许多领域,需要用软件方法来实现它,在这种情况下,它的效率相对较低。1997年4月15日美国国家标准和技术研究所(NIST)发起征集AES(Advanced Encryption Standard)算法的活动,并成立了AES工作组。目的是为了确定一个非保密的、公开披露的、全球免费使用的加密算法,用于保护下一世纪政府的敏感信息。这里,我们对AES的基本原理进行介绍:

FPGA/MATLAB学习教程/源码/项目合作开发 2546

YOLO11 改进 - C2PSA | C2PSA融合HEWL(高频增强小波层):小波逆变换+双通道注意力增强+高频显式增强 | TGRS 2026

本文介绍了高频增强小波层(HEWL),一种专为解决红外小目标检测中边缘退化与语义模糊问题设计的上采样模块。该方法结合小波逆变换与交替通道注意力(ALCA),通过显式增强高频细节并优化特征融合,实现精准的边缘重建与语义对齐。我们将 HEWL 融入 PSABlock 结构构建了 C2PSA_HEWL 模块,并成功集成进 YOLO11 的骨干网络,替代原有的 C2PSA 模块。实验证明,结合 HEWL 的 YOLO11 在检测任务中表现优异,有效提升了模型对细节特征的捕捉能力。

魔改工程师的博客 102

dispatch_barrier_async的使用

dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行. 在如下场景: 在访问数据操作时,可以并行读取,因此这种操作应该放到concurrent Dispatch Queue中,写入操作是在任何读取操作执行之前,放到serial Dispatch Queue,在写入处理结束之前,读取处理操作不可进行。 此时使用dispatc

richard_如风的专栏 2297

SpringBoot 系列教程(二):SpringBoot使用Devtools实现热部署

1.devtools   spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。 2.项目搭建   本文是采用IDEA搭建的Spring Boot应用,通过spring-boot-devtools配置,可以支持修改java文件会自动重启程序,一些资源无需触发重启,...

Thinkingcao的专栏 1215

dispatch_barrier_GCD学习之dispatch_barrier_async详解

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

weixin_36180471的博客 2014

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

dispatch_barrier_sync 和dispatch_barrier_async的区别

需求:有4个任务{1,2,3,4},执行完前2个再执行后2个 这里我们用到栅栏函数dispatch_barrier_(a)sync,(也可以用队列组),我们要注意的是不能使用全局并发队列(系统提供给我们的)否则会散失栅栏函数的意义 区别:先看官方文档 dispatch_barrier_sync: Submits a barrier block object for execution and waits until that block completes.(提交一个栅栏函数在执行中,它会等待栅栏函数执行完

More reading and learning to become excellent 1337

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

栅栏函数dispatch_barrier_sync/async

有几个并行执行的操作:1,2,3,4,5 如果我们想要在1,2,3执行完毕后,执行A操作,然后再执行4,5 那么我们就可以使用栅栏函数来解决; 1、使用dispatch_barrier_sync 串行 函数: 在插入队列的时候是串行的,在任务真正执行的过程中也是串行的。 - (void)testCustomBarrier{ dispatch_queue_t currentQueue = d...

whxuan_ios的博客 610

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

dispatch_barrier_async和dispatch_barrier_sync的区别在哪呢?

先看用dispatch_barrier_sync代码: 给的图里写的是dispatch_barrier_sync,因为我们需要先看看我们熟悉的等待——sync是什么效果,直接跑起来 ,看结果如下 可以看到,确实是1、2、3号任务并发执行完了,然后再执行我们dispatch_barrier_sync中的任务,再并发执行的4、5、6号任务,当然,point3和barrier之间是有明显停顿的,截

ivolcano的博客 1659

dispatch_barrier_async一些用法

- (NSDictionary *)HTTPRequestHeaders { NSDictionary __block *value; dispatch_sync(self.requestHeaderModificationQueue, ^{ value = [NSDictionary dictionaryWithDictionary:self.mutableHTT

chenmo230的博客 743

dispatch_barrier_async和dispatch_barrier_sync

dispatch_barrier_async和dispatch_barrier_sync是 GCD 中的两个方法。是不是和dispatch_async及dispatch_sync长得很像,就是多了一个barrier(译:栅栏)。 没错,除了有dispatch_async或dispatch_sync的作用外(是否阻塞当前线程),还有“栅栏”的效果。 意思就是,以他们为界,待前面任务执行完成,再把自

金鱼的博客 853

dispatch_barrier_async函数

写篇文章实践一下这个函数 . dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-1");

wangzitao126的专栏 2835

iOS之GCD再谈(dispatch_barrier_async)

假如有这么一个需求,8个线程,前面4个要并行执行,执行完后执行第5个,然后在并行执行后面3个。 那么就要考虑dispatch_barrier_async了 /* dispatch_barrier_async 作用是在并行队列中,等待前面几个操作并行操作完成,然后执行dispatch_barrier_async中的操作, 然后再恢复并行队列所有的执行状态,继续并行执行 */ #impor

gujinyue 794

dispatch_barrier_iOS dispatch_barrier_async的作用

dispatch_queue_t concurrentQueue =dispatch_queue_create("my.concurrent.queue",DISPATCH_QUEUE_CONCURRENT);dispatch_async(concurrentQueue, ^(){NSLog(@"dispatch-1");});dispatch_async(concurrentQueue, ^()...

weixin_29115107的博客 246

dispatch_barrier_async和dispatch_barrier_sync的使用

首先,barrier的直译是障碍,栅栏和分界线的意思! 所以可以很直观的想到这个使用与在GCD中设置障碍用的! 例如,要之前三部分任务,第二部分要在第一部分之后才执行,第三部分要在第二部分之后才执行,所以可以把第二部分视作一个障碍! 当然也可以使用dispatch_group来实现,但是这里使用barrier更简单直观! 直接上代码dispatch_queue_t queue = disp

willluckysmile的博客 5406

iOS面试:dispatch_barrier_async的作用是什么?

是 Grand Central Dispatch (GCD) 中的重要函数,主要用于并发队列中,以确保在某些特定情况下的线程安全和操作顺序。是一个强大的工具,用于管理并发队列中的读写操作,防止数据竞争,并保证操作的顺序。当没有写权限的操作并行执行时,性能会更高。例如,先进行多个数据读取操作,然后再执行一次数据写入操作,这样可以保证写操作是最后被执行的。在并发队列中,当有读(读取数据)和写(修改数据)的操作时,可能会导致数据的不一致性。在写操作完成后,后续的读取任务可以继续执行,这确保了数据的完整性。

androiios的博客 542
上一篇: Dispatch Group
下一篇: dispatch_sync
去趟云南
博客等级 码龄12年 13粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值