GCD死锁

STM32F407串口DMA收发实战:标准库配置与环形缓冲区实现 DMA(直接存储器访问)是嵌入式系统中提升数据传输效率的核心技术,它允许外设与内存直接交换数据而无需CPU干预。其工作原理是通过专用硬件控制器接管数据搬运任务,CPU仅需初始化传输参数即可处理其他事务,从而显著降低系统负载。这项技术的核心价值在于释放CPU算力,实现高吞吐、低延迟的实时通信,尤其适用于数据采集、工业控制和通信网关等场景。在STM32F407等ARM Cortex-M4芯片中,串口结合DMA可实现稳定的高速数据流处理。本文以STM32F407标准库为基础,深入解析USART1的DMA发送与接收 阅读详情

这段代码跑一下,就懂得什么时候会造成死锁了。
一部分一部分的跑。

    dispatch_queue_t  queue=   dispatch_get_main_queue();
    dispatch_queue_t  chqueue = dispatch_queue_create("com.demo.SerialQueue", DISPATCH_QUEUE_SERIAL);
    //在非主线程中同步主线程不会造成死锁
    dispatch_async(queue, ^{
        NSLog(@"串行队列异步线程开始");
        dispatch_sync(chqueue, ^{
            NSLog(@"同步线程主线程执行完毕");
        });
        NSLog(@"串行队列异步线程执行完毕");
    });

    dispatch_async(chqueue, ^{
        NSLog(@"串行队列异步线程开始");
        dispatch_sync(chqueue, ^{
            NSLog(@"串行队列同步线程,死锁");
        });
        NSLog(@"串行队列异步线程执行完毕");
    });
    dispatch_sync(queue, ^{
        NSLog(@"串行队列同步线程,这下主线程也GG了");
    });

结论就是
在同一个串行队列里面进行同步操作,会造成死锁,其他情况不会。
可以去试试下面的题目
死锁题目

这里写图片描述

自定义的串行队列
如果前面调用过了 再次调用
不管前面是同步 还是异步 以下是两个例子
都会死锁

    dispatch_queue_t queue = dispatch_queue_create("com.demo.serialQueue111", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1"); // 任务1
    dispatch_async(queue, ^{
        NSLog(@"2"); // 任务2
        dispatch_sync(queue, ^{
            NSLog(@"3"); // 任务2
        });
        NSLog(@"4"); // 任务4
    });
    dispatch_queue_t queue = dispatch_queue_create("com.demo.serialQueue111", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1"); // 任务1
    dispatch_sync(queue, ^{
        NSLog(@"2"); // 任务2
        dispatch_sync(queue, ^{
            NSLog(@"3"); // 任务2
        });
        NSLog(@"4"); // 任务4
    });

不会死锁的情况

    dispatch_queue_t queue = dispatch_queue_create("com.demo.serialQueue111", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1"); // 任务1
    dispatch_sync(queue, ^{
        NSLog(@"2"); // 任务2
    });

背诵一下:
串行队列会拼在后面,同步串行有可能死锁(主队列直接锁。自创队列取决于之前有无调用)、
并行队列同步按顺序执行。异步同时进行、顺序不一定。

    dispatch_queue_t queue = dispatch_queue_create("com.demo.serialQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"1"); // 任务2
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"2"); // 任务3
        });
        NSLog(@"3"); // 任务4
    });

主队列这种情况是不会死锁的。这里还是有点不明白

 //memcpy(dest, src, len) 
 拷贝n个字节从内存中的src到dest的内存区域中。
 len变量是用来表示拷贝多少字节,一般会使用sizeof,或者strlen计算出len的值
 内存区域不能有重叠,如果有重合,要使用memmove函数
 memcpy(&resp, respBuffer, sizeof(SMsgAVIoctrlPushDeviceNameResp));
 //memset(void *s,int c,size_t n)  memset(dest, val, len)   
总的作用:将已开辟内存空间dest 的首 len个字节的值设为值 val。
//memset(&info, 0, ipcSize);

1

这是结构体转换成 模型再上传
           //获取设备信息回应结构体
                    SMsgGetTWDeviceInfoResp resp;
                    //拷贝 收到的buffer 长度为结构体长度给 resp
                    memcpy(&resp, respBuffer, sizeof(SMsgGetTWDeviceInfoResp));
                    //获取ipc信息大小
                    size_t ipcSize = sizeof(SMsgIpcInfo);
                    //头部信息大小为 总长度 --- ipc 信息长度大小
                    size_t headerSize = sizeof(SMsgGetTWDeviceInfoResp)-ipcSize;
                    //创建ipc信息结构体
                    SMsgIpcInfo info;
                    //创建数组
                    NSMutableArray *deviceArray = [[NSMutableArray alloc] init];
                    // 获取回应的设备个数 循环
                    for (int i=0; i<resp.subDeviceCount; i++) {
                        //将ipc信息每位都初始化为0
                        memset(&info, 0, ipcSize);
                        //将ipc大小的信息 将收到的buffer+头部信息大小+ipc 的大小 传入  长度为 ipcsize
                        //应该是只传递了最后一段
                        memcpy(&info, respBuffer+headerSize+ipcSize*i, ipcSize);
                        //通过info 转换为模型
                        TWIpcInfo *ipcInfo = [self ipcInfoWithSmsg:info];
                        [deviceArray addObject:ipcInfo];
                    }


- (TWIpcInfo *)ipcInfoWithSmsg:(SMsgIpcInfo)smsg {
    TWIpcInfo *info = [[TWIpcInfo alloc] init];
    info.deviceId = [NSString stringWithFormat:@"%s", smsg.deviceId];
    info.version = smsg.version;
    info.codecId = smsg.audioInfo.codecId;
    info.sample_rate = smsg.audioInfo.sample_rate;
    info.bitdata = smsg.audioInfo.bitdata;
    info.channels = smsg.audioInfo.channels;
    return info;
}
学习 考证 帆软 FCP-FineBI V6.0 考试经验 参加这个学习班,认识了新朋友,可能是我职业生涯中的一次重要体验,其实大家想想 IT 和 医生一样都是需要终身学习的。只是医生学习周期更长但是回报率也更高。大家觉的呢? 阅读详情

相关推荐

Mac用户看过来!M1/M2芯片安装CiteSpace完整指南(从Homebrew到成功运行)

本文为Mac M1/M2芯片用户提供CiteSpace安装的完整指南,从Homebrew安装适配的Java环境到最终成功运行CiteSpace。详细步骤包括环境检查、Java配置、CiteSpace下载与优化,解决常见问题如内存分配、图形渲染和中文显示乱码,确保科研人员能顺利使用这一文献可视化工具。

weixin_42530458的博客 299

一篇专题让你秒懂GCD死锁问题!

为什么80%的码农都做不了架构师?>>> ...

weixin_34261739的博客 287

自动驾驶关键技术(一):时间敏感网络TSN

时间敏感网络TSN的基本概念、协议族介绍和开发流程。

3077

关于GCD死锁

文章首发于个人博客地址:关于GCD死锁 如需转载,请附带说明文章出处。 问题 有很多文章经常会说“在主线程使用了sync函数就会造成死锁”或者是“在主线程使用了sync函数,同时将任务传入串行队列就会死锁”。那么这些说法是否正确呢? 答:不正确!! 。 GCD死锁的原因是队列阻塞而不是线程阻塞。 那么GCD死锁到底是怎么回事儿呢? 本文的分析基于已经了解了GCD的基本知识。 基本知识介绍 串行队列和并行队列 参照下图: 上图表明了几点: 串行队列和并行队列都是先进先出,区别在于其队列中任务的执行方式

键盘吧嗒吧嗒 937

【自动驾驶学习笔记——Prescan和Simulink 学习笔记和问题记录(1)】

主要记录一些Prescan/Simulink 联合仿真出现的问题。

ly1336545868的博客 1464

三、参考比较法之城市建成区提取——提取

在正式开始提取之前,还是要继续啰嗦一下,其实基于夜间灯光数据建成区提取,可以分为好几个层次,基于县一级、市一级、省一级,很多论文的做法都是以市一级为准,也就是统计好市一级城市的每一年的统计年鉴中的建成区面积作为备用。有人可能会问为什么不以县一级,由于县一级的统计数据一般存在缺失,很难形成一个长时间序列的数据,所以一般采取的是市一级。前文也进行建议,如果确实要基于县一级进行提取可以参考前面理论介绍那篇文章中的相关建议。那么当我们确定阈值后如何将城市建成区提取出来?

端木宛白的博客家园 5401

彻底搞懂OC中GCD导致死锁的原因和解决方案

GCD提供了功能强大的任务和队列控制功能,相比于NSOperationQueue更加底层,因此如果不注意也会导致死锁。所谓死锁,通常指有两个线程A和B都卡住了,并等待对方完成某些操作。A不能完成是因为它在等待B完成。但B也不能完成,因为它在等待A完成。于是大家都完不成,就导致了死锁(DeadLock)。有一定GCD使用经验的新手通常认为,死锁是很高端的操作系统层面的问题,离我很远,一般不会遇上。其实

KT的iOS开发小站 2万+

储能电池管理系统介绍(一)

介绍储能BMS的架构以及各模块功能

manjixingkong1234的专栏 1914

GCD死锁之你过来啊

死锁 概念 百度百科:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程 水手理解:线程中存在两个执行的任务A和B,任务A需要任务B执行完成才能往下执行,任务B需要任务A完成执行并返回也才能往下执行,所以导致两个任务互相等待使程序无法继续执...

jbr5740的专栏 281

QGraphicsView通过鼠标操作来绘制图元

在Visio和MindManager等类似的图元操作软件中,很多时候我们会通过鼠标操作来添加自定义的图元。这里就介绍一下如何在QT的图形视图框架中通过鼠标绘制来添加图元。

yang1fei2的博客 3575

基于simulink的能量管理策略的场景实例:混合动力电动汽车(HEV)的能量回收与分配策略

本文以混合动力电动汽车(HEV)为研究对象,通过Simulink建模详细演示了能量管理策略的设计与实现。内容涵盖HEV系统架构、核心组件工作原理,并分步骤指导搭建车辆动力学模型、动力系统组件模型和基于规则的能量管理策略。重点分析了制动能量回收与功率分配机制,通过仿真验证了逻辑门限策略在提升燃油经济性和维持电池SOC平衡方面的有效性。文章最后展望了更高级控制策略的应用前景,为HEV能量优化提供了完整的仿真研究框架。

xiaoheshang_123的博客 212

GCD学习笔记

文章参考:GCD 关于同步和异步 dispatch_async/dispatch_sync dispatch_sync意味着同步,也就是将指定任务追加到队列,在追加的任务执行结束之前,dispatch_sync函数会一直等待。 dispatch_async意味着异步,将指定任务追加到队列,在追加的任务执行结束之前,dispatch_async函数不会做任何等待。 关于串型队列和并发对列 队列类型...

qq_44865905的博客 162

老版QQ原生表情gif动态

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

五个案例让你明白GCD死锁

五个案例让你明白GCD死锁 作者:brighttj(@saitjr 网址:http://www.brighttj.com/ios/ios-gcd-deadlock.html 死锁一直都是在使用多线程时,需要注意的一个问题。以前对同步、异步,串行、并行只有一个模糊的概念,想想也是时候整理一下了。再看看之前的博客,已经很久没有干货了【说得好像之前有干货一样】,所以,这篇博客...

dem57164的博客 115

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

GCD 死锁

参考:http://ios.jobbole.com/82622/ GCD死锁原理     1.串行队列与并发队列: 在使用GCD的时候,我们把需要处理的任务放到block中,然后将任务追加到相应的队列里面。这个队列叫做Dispatch Queue。存在两种Dispatch Queue 一种是要等待上一个执行完,在执行下一个的Serial Dispatch Queue,这种叫做串

Dlg1992的博客 982

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

GCD 之线程死锁

GCD相比NSOperation,无法cancel正在进行的线程。 GCD用不好会造成死锁。- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"=================1"); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"=========

jackshiny的专栏 716

GCD死锁 分析

原文出处: brighttj(@saitjr)    死锁一直都是在使用多线程时,需要注意的一个问题。以前对同步、异步,串行、并行只有一个模糊的概念,想想也是时候整理一下了。再看看之前的博客,已经很久没有干货了【说得好像之前有干货一样】,所以,这篇博客,我尽最大努力,也借鉴了很多其他博客中的例子,来讲解GCD死锁问题。 环境信息: Mac OS X 10.10.5 Xcod

星宇大前端 1071

iOS - GCD死锁

普通死锁 队列 串行队列 调度方法 同步调用(dispatch_sync) 同一个Q 当前所分发到的Q 和 “外部Q” 是否是同一个Q { NSLog(@"不死1"); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"死锁"); }); } 高级死锁 调度方法 同步阻塞调用(dispatch_barrier_sync) 同一个Q 当前所分发到的Q 和 “外部Q” 是否是同一个Q { //并行队

宋卓的博客 547

gcd 发生死锁的一种情况

主队列,同步任务,会发生死锁。 代码如下: dispatch_queue_t q = dispatch_get_main_queue();     dispatch_sync(q, ^{         NSLog(@"Hello World");     }); 第二种,同步里面嵌套同步,也会发生死锁。 代码如下: dispatch_queue_t q = dis

pilqc2009的专栏 622

GCD线程死锁

GCD 之线程死锁 GCD 确实好用 ,很强大,相比NSOpretion 无法提供 取消任务的功能。 如此强大的工具用不好可能会出现线程死锁。 如下代码: - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"=================4"); dispatch_sync(dispatch

发飙的蜗牛 250

GCD 死锁原因

死锁 1、定义: 所谓死锁,通常指有两个线程T1和T2都卡住了,并等待对方完成某些操作。T1不能完成是因为它在等待T2完成。但T2也不能完成,因为它在等待T1完成。于是大家都完不成,就导致了死锁(DeadLock)。 2、产生死锁的条件: 产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3...

weixin_34249367的博客 216

GCD死锁及取消

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34289454的博客 322

GCD死锁与同步异步串行并行

目录 一、定义 1、队列 2、串行并行 3、同步异步 二、各种组合 1、同步串行: 2、异步串行 3、同步并行 4、异步并行 三、死锁 1、同步与主线程造成死锁 2、同步与某一线程造成死锁 3、主线程与循环 一、定义 1、队列 队列 queue 负责任务的调度,分为串行、并行、主队列,全局队列,队列的调度特点为先进先出,后加入的任务放在队尾。 2、串行并行 串行...

卖报的小行家 344

iOS 多线程编程 GCD 死锁

GCD:Grand Central DiapathGCD多线程中的几组概念: 任务:即操作,你想要干什么,说白了就是一段代码,在GCD中的一个block就是一个任务。 任务的执行方式有两种: 同步执行和异步执行,两者的区分在于是否会阻塞当前线程直到block中的任务执行完毕。 同步执行(sync) :会阻塞当前线程并等待 Block 中的任务执行完毕,然后当前线程才会继续往下运行。

学海无涯苦作舟 890
上一篇: 二叉树编码(数组)
下一篇: router设置
csdn_Damon
博客等级 码龄10年 37粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值