自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

最后一个bug的博客

大家好,我是bug菌,一名嵌入式爱好者~

  • 博客(716)
  • 收藏
  • 关注

原创 教你快速理解linux中的NUMA节点探测是干什么用的?

NUMA节点探测就是Linux开机时自动发现电脑里“哪些CPU和内存是组团工作的”,并做好标记,后续分配任务时尽量让CPU用“本地内存”,提升效率。每个区有自己的超市(内存),居民(CPU)去本区的超市买东西最快,去其他区的超市会慢一些。给每个节点贴上编号(比如Node 0、Node 1),告诉系统:“这是两个独立的小王国,尽量让它们自己管自己的事情”。像“市长”一样,检查电脑里有多少个CPU群(比如2组,每组8核)和对应的内存条,确定哪些CPU和内存离得近。如果用了节点1的内存,速度会下降。

2025-04-02 00:11:13 205

原创 linux内核`fixmap`和`memblock`有什么不同?

是两个不同层次的内存管理机制,分别用于不同的场景和阶段。使用阶段 启动早期(伙伴系统初始化前) 启动早期 + 内核运行期间(部分映射)为这些内存或硬件提供虚拟地址映射,使内核能够在页表未完全建立时访问关键资源。主要目的 跟踪和分配物理内存 提供固定虚拟地址映射。依赖关系 不依赖页表 依赖内核页表配置。特性 memblock fixmap。持久性 临时,最终被替代 长期存在。管理对象 物理内存 虚拟地址映射。fixmap的典型使用。负责分配物理内存,而。

2025-04-01 23:47:31 236

原创 “贴片电阻大小“的迷你8脚MCU有啥用?

1、内核: Arm® 32 位 Cortex®-M0+ CPU,频率高达 24MHz,晶振内置了,主频不高,好像比在学校那时候玩的8051单片机要高一点。同时结合前面的功能个数,ADC、IIC、UART、SPI、GPIO与外部交互的大概就这些吧,各个引脚也是复用的,很多时候都需要再接口上取舍。然而又让我好奇的是,这8个脚的MCU能有啥功能,有那些可以连接到外部的外设呢?小尺寸释放PCB空间,相同体积能够摆更多其他的部件,比如可容纳更大电池容量、其他的传感器芯片可以功能更加丰富。

2025-03-30 21:45:47 317

原创 “贴片电阻大小“的迷你8脚MCU有啥用?

1、内核: Arm® 32 位 Cortex®-M0+ CPU,频率高达 24MHz,晶振内置了,主频不高,好像比在学校那时候玩的8051单片机要高一点。同时结合前面的功能个数,ADC、IIC、UART、SPI、GPIO与外部交互的大概就这些吧,各个引脚也是复用的,很多时候都需要再接口上取舍。然而又让我好奇的是,这8个脚的MCU能有啥功能,有那些可以连接到外部的外设呢?小尺寸释放PCB空间,相同体积能够摆更多其他的部件,比如可容纳更大电池容量、其他的传感器芯片可以功能更加丰富。

2025-03-30 21:45:47 305

原创 “贴片电阻大小“的迷你8脚MCU有啥用?

1、内核: Arm® 32 位 Cortex®-M0+ CPU,频率高达 24MHz,晶振内置了,主频不高,好像比在学校那时候玩的8051单片机要高一点。同时结合前面的功能个数,ADC、IIC、UART、SPI、GPIO与外部交互的大概就这些吧,各个引脚也是复用的,很多时候都需要再接口上取舍。然而又让我好奇的是,这8个脚的MCU能有啥功能,有那些可以连接到外部的外设呢?小尺寸释放PCB空间,相同体积能够摆更多其他的部件,比如可容纳更大电池容量、其他的传感器芯片可以功能更加丰富。

2025-03-30 21:45:47 344

原创 “贴片电阻大小“的迷你8脚MCU有啥用?

1、内核: Arm® 32 位 Cortex®-M0+ CPU,频率高达 24MHz,晶振内置了,主频不高,好像比在学校那时候玩的8051单片机要高一点。同时结合前面的功能个数,ADC、IIC、UART、SPI、GPIO与外部交互的大概就这些吧,各个引脚也是复用的,很多时候都需要再接口上取舍。然而又让我好奇的是,这8个脚的MCU能有啥功能,有那些可以连接到外部的外设呢?小尺寸释放PCB空间,相同体积能够摆更多其他的部件,比如可容纳更大电池容量、其他的传感器芯片可以功能更加丰富。

2025-03-30 21:45:47 157

原创 Linux的异常修复机制__ex_table主要作用

Linux的异常修复机制(尤其是异常表(__ex_table))主要用于处理内核在执行过程中遇到的预期内的可恢复错误,而不是修复内核自身的代码逻辑错误或设计缺陷。它的核心目标是安全地处理用户空间与内核空间交互时可能触发的异常(如访问无效内存地址),防止这些异常直接导致内核崩溃(panic)或系统不稳定。等函数)时,用户空间传递的地址可能是无效的(如空指针、未映射的地址等)。当内核需要访问用户空间提供的内存地址(例如通过。// 内核代码尝试读取用户空间地址。

2025-03-30 20:15:08 73

原创 为什么不能直接建立完整的内存映射而是要经过fixmap?

在操作系统启动的早期阶段,直接建立完整的内存映射在技术上不可行或效率极低,而 Fixmap 提供了一种轻量级、静态预定义的映射机制,解决了这一矛盾。此时若尝试构建完整页表,会面临 “鸡生蛋,蛋生鸡” 问题:页表需要内存分配,但内存分配依赖页表。完整页表 动态分配 大 内存管理子系统就绪 正常运行阶段。阶段 1:引导加载程序(Bootloader)(1) 完整页表需要动态内存管理。(3) 无需依赖动态内存。阶段 3:早期初始化(阶段 4:完整内存映射。(2) 极简映射范围。阶段 2:内核入口(

2025-03-30 16:54:17 12

原创 嵌入式PCIe gen2接口能用gen3-4的固态ssd吗?

在 NVMe 固态硬盘(SSD)领域,PCIe Gen2 接口的 NVMe SSD 已非常罕见,因为主流市场已过渡到 PCIe Gen3/Gen4/Gen5。PCIe Gen2 x4 的理论带宽为 2 GB/s,实际顺序读写速度通常在 1.5~1.8 GB/s,远低于 Gen3/Gen4 SSD 的标称速度。PCIe 接口在物理上是通用的(M.2 2280 形态),但需主板支持 NVMe 协议。二、PCIe Gen3/Gen4 SSD 在 Gen2 接口下的兼容性。

2025-03-29 10:28:28 20

原创 linux两个重要的固态硬盘驱动说明

启用对 NVMe(Non-Volatile Memory Express)协议的固态硬盘的驱动支持。启用对 SCSI 接口存储设备的支持,包括传统 SCSI 硬盘、SAS(串行 SCSI)硬盘,以及某些 U.2 接口的 SSD(例如企业级 NVMe SSD 通过 SCSI 协议封装使用)。这段配置是 Linux 内核编译时的选项设置,用于控制 SCSI 设备和 NVMe 固态硬盘的驱动支持。> SCSI disk support 支持 SCSI 接口的 SSD(如 U.2)

2025-03-29 10:20:38 47

原创 linux的固态硬盘驱动问题

在 Linux 内核中,固态硬盘(SSD)的驱动默认是启用的,但具体支持的驱动类型取决于 SSD 的接口协议(如 NVMe、SATA、AHCI)和内核版本。> SCSI disk support 支持 SCSI 接口的 SSD(如 U.2)系列驱动 是(支持主流厂商如 Samsung、Intel)接口类型 内核驱动模块 是否默认启用。是(编译为模块,检测硬件后自动加载)临时禁用 NVMe 驱动(调试时使用)是(默认内置或编译为模块)Q: SSD 未被识别?

2025-03-29 10:17:21 53

原创 为何单片机总跟printf过不去呢?

标准printf通常在5~10KB左右,像有些lib库的printf功能更多占据的单片机flash空间更大,对于那些flash也才32KB的单片机来说太大了,但软件工程师又喜欢用,毕竟好用,那就“动刀”咯。堪称“瑞士军刀级”的调试工具——它简单粗暴,可以实时看到动态数据变化,还可以插桩打印让开发者快速定位问题,不管是玩单片机还是嵌入式Linux都备受宠爱,比如linux内核中的printk。格式化不同的数据其耗时相对不太稳定,重要的是耗时较多,对于实时任务直接打印是吃不消的,而且。

2025-03-26 22:18:02 1091

原创 stm32MP2使用 root=/dev/mmcblk1p8 启动时出现 root device not found 错误

如果问题依旧,需检查硬件连接、内核驱动和分区表。对应的存储设备尚未初始化完毕,导致设备节点未创建。这些标识符不依赖设备节点顺序,更稳定可靠。:内核缺少驱动支持或硬件初始化失败。:分区存在但文件系统无法挂载。可能不是实际存在的分区。替代设备路径,并添加。

2025-03-24 17:38:42 387

原创 波士顿动力机器人Atlas,为何如此丝滑~

策略是参考了人类动作捕捉和动画,所以才如此丝滑,这次演示在波士顿动力公司与机器人与人工智能研究所(RAI 研究所)的研究合作伙伴关系下完成。:采用PPO、SAC、DDPG等算法,通过仿真环境(如MuJoCo、PyBullet)训练策略,使机器人在动态环境中优化动作。动力机器人又更新了,在如下视频中机器人Atlas使用动作捕捉开发的强化学习策略进行动作演示,大概的意思就是机器人的运动。:包括机器人本体传感器数据(关节角度、陀螺仪、力反馈)和任务相关状态(如目标位置)。

2025-03-21 11:40:46 606

原创 Linux文件挂载新文件夹,隐藏老文件夹问题

挂载到目录A会隐藏其原有子目录B/C,这是Linux文件系统的设计特性。若需保留原有内容,应避免直接挂载到非空目录,或改用其他方案(如挂载到子目录或使用联合文件系统)。

2025-03-20 16:12:06 78

原创 老听说json,在单片机软件开发中有啥用?

有了流式解析后,解析完部分数据后,可立即释放相关内存,维持低内存占用。这不最近一个"小项目"又把这玩意拿过来用用,整体还是挺舒适的,主要是json易读也比较容易把握,那顺便聊聊吧~在资源受限的单片机上解析JSON,开发者常面临内存不足、解析性能差等问题,所以在单片机上用cjson比较合适,:使用JSON定义通信指令,可读性不错,方便调试扯皮,扩展性不错增删都能够较好兼容。:将配置存储在JSON文件中,通过cJSON解析,增删都很方便,有较好的兼容性,及时的释放资源,防止内存泄漏,不然跑着跑着就奔了~。

2025-03-17 22:12:19 534

原创 C11标准对于C语言的内存模型的描述

C11内存模型通过原子操作、内存顺序规则和线程支持,为多线程编程提供了标准化框架。它既保留了C语言的底层控制能力,又通过内存顺序参数实现了性能与正确性的灵活权衡,显著提升了并发程序的可移植性和可靠性。C11标准(ISO/IEC 9899:2011)对C语言的内存模型进行了重大改进,主要围绕多线程并发编程的规范化和安全性展开。允许编译器和硬件对非原子操作进行重排序,以提升性能,但需开发者通过同步操作(如锁、原子变量)显式控制可见性。通过原子操作和内存顺序规则,显式定义共享变量的访问顺序,消除未定义行为。

2025-03-16 23:00:52 742

原创 C语言为例谈数据依赖性

在存在数据依赖的情况下,编译器或处理器会保证这些操作的执行顺序,因此不需要显式地使用内存屏障(Memory Barrier)。但在多线程环境下(共享内存),如果数据依赖跨越线程,可能需要显式同步机制(如内存屏障或原子操作)。数据依赖通过隐式的顺序约束避免了内存屏障的使用,但仅适用于单线程或原子操作/同步机制保护的多线程场景。现代处理器(如x86、ARM)的乱序执行(Out-of-Order Execution)会动态检测数据依赖,并保证依赖操作的顺序。// 数据依赖:index 的值影响内存访问地址。

2025-03-14 00:15:33 288

原创 软链接在编译stm32MP2镜像中的作用

中的设备树文件或 TF-A 配置被修改,软链接会实时指向最新内容,无需手动复制文件到目标目录。如果多个项目共用同一套设备树文件,软链接可以避免重复存储文件,方便统一维护。如果源文件被删除或路径变更,软链接会失效(表现为“断链”),需重新创建。将源目录挂载到目标目录,实现类似软链接的效果,但需要管理员权限。通配符时,软链接会为每个文件单独创建链接(而非链接整个目录)。),通过软链接可以将主机上的开发资源整合到虚拟机的编译环境中。中已有同名文件,软链接会失败(需先删除冲突文件)。

2025-03-13 08:45:37 388

原创 嵌入式开发中的“过度设计”

正文大家好,我是bug菌,又见面了~今天跟大家聊聊过度设计这个话题,前段时间隔壁团队来了一位新人,然后给了他一个案子来做,项目不算难,不过在做方案评审的时候,给我的感觉就是为了一个小的项目他想把毕生所学的软件知识都得用上,所以在脑海里自然而然的想到了一个词"过度设计"。1完美主义陷阱大家应该都有听过“工程师的完美主义陷阱”,是指在工作中过度追求完美而带来诸多问题的状态。表现为过度设计、过度优化、反...

2025-03-11 21:55:43 294

原创 一个简化版的进程内通信库实现

该实现约200行代码,体现了ZeroMQ的核心思想,可根据需求进一步扩展功能。以下是一个简化版的进程内通信库实现,支持类似ZeroMQ的。实际实现中可优化为引用计数,此处为简化版使用内存拷贝。仅依赖POSIX线程库,适用于多线程通信场景。使用互斥锁和条件变量实现生产者-消费者模型。PUSH/PULL模式。

2025-03-11 00:00:53 142

原创 linux的内存映射文件功能太强了~

内存映射文件(Memory-Mapped File)是一种将磁盘文件直接映射到进程虚拟地址空间的技术,允许程序像操作内存一样读写文件内容。内存映射文件通过消除冗余数据拷贝和简化访问逻辑,显著提升了处理大文件或频繁访问文件的效率。它在高性能计算、数据库、多媒体处理等领域广泛应用,但需谨慎处理同步、错误和资源管理问题。大文件性能 高效(按需加载) 可能因频繁缓冲降低性能。跨进程共享 天然支持 需额外机制(如管道、共享内存)代码复杂度 低(指针操作) 高(需管理读写位置)

2025-03-09 11:01:47 714

原创 用C语言编写的ZeroMQ inproc线程通信库

这个实现展示了ZeroMQ inproc的核心用法,可以作为构建更复杂线程通信系统的基础。

2025-03-08 18:53:09 125

原创 linux条件变量用于线程通信

条件变量是Linux多线程编程中实现线程通信与同步的核心机制,其核心作用在于协调线程间的执行顺序,避免忙等待(busy-waiting)带来的资源浪费。如网页6的示例,主线程每生成四次任务后通过条件变量触发子线程执行,实现周期性协作^6。实现阻塞等待,该函数会自动释放关联的互斥锁并挂起线程,直至其他线程触发信号。例如,网页8的代码中,生产者填充共享数组后触发信号,消费者在条件变量上等待数据可用。线程池中,当无可用资源时,工作线程通过条件变量挂起,直到资源释放后被唤醒。设置等待超时,防止线程永久阻塞。

2025-03-08 18:49:52 378

原创 makefile中采用echo进行调试

printf “多行变量:\n$(MULTILINE_VAR)\n”立即展开变量: Tue Jun 1 12:00:00 UTC 2024。@echo “命令行传入的变量: $(OVERRIDE_VAR)”@echo “立即展开变量: $(IMMEDIATE_VAR)”@echo “特殊变量: $(SPECIAL_VAR)”@echo “延迟展开变量: $(LAZY_VAR)”@echo “调试 VAR的值是: $(VAR)”@echo “变量值: $(VAR)”@echo “变量值: $VAR”

2025-03-05 23:37:10 491

原创 AI大模型正在拉齐嵌入式工程师的水平

正文大家好,我是bug菌,又见面~在嵌入式开发领域,也不仅仅是嵌入式行业吧,几乎整个技术开发行业,一个非常残酷的现实长期存在:资深工程师凭借经验积累,往往能在数小时内解决新手工程师数天都难以攻克的难题。当开发板点不亮时,有人能通过示波器波形瞬间定位硬件问题,有人却在软件堆栈里反复兜圈;当RTOS出现优先级翻转时,老手能快速重构任务调度,新手可能连问题表象都难以理解。然而这种技术代差正在被AI大模型...

2025-03-05 21:32:18 789

原创 ARM处理器的Store Buffer大小有限,内存屏障也无法保障可见性顺序

在双核A35处理器中,当Test1函数中包含大量赋值操作时,是否会导致部分数据在。

2025-03-04 22:07:23 112

原创 在Linux实时任务中,锁的使用需要谨慎

因此,在Linux实时任务中使用锁要充分考虑其对实时性的影响,通过合理的设计和选择合适的锁机制及协议来尽量减少负面影响,以满足实时任务的要求。在Linux实时任务中,锁的使用需要谨慎,但不能说完全不适合用锁。

2025-03-04 12:29:58 315

原创 一种事件驱动的设计模式-Reactor 模型

Reactor 模型通过。

2025-03-03 19:22:33 928

原创 调试利器`bitbake <package> -c devshell`

这个软件包是在BitBake的构建系统中定义的,通常对应着一个具体的软件项目或组件,比如Linux内核、某个应用程序等。在构建过程中,BitBake会根据软件包的定义文件(通常以.bb为后缀)来获取该软件包的源代码、配置信息、构建指令等。:BitBake工具的主命令,用于执行各种与构建相关的操作,比如构建软件包、生成镜像、处理依赖关系等。这在开发和调试嵌入式软件时非常有用,开发者可以在这个特定的环境中对软件包进行深入的分析和修改,而不必担心影响到系统的其他部分或其他软件包的构建环境。

2025-03-03 16:28:40 75

原创 形象生动讲解Linux 虚拟化 I/O

Linux 虚拟化 I/O 的本质,就是让虚拟机像直接操作硬件一样快,同时还能共享硬件资源。就像房东既能让租客独立生活,又能高效管理整栋楼的资源。用现实生活的比喻和简单例子来解释 Linux 虚拟化 I/O,就像给朋友讲故事一样。虚拟化 I/O 的作用,就是让每个租客能高效、安全地共享房东的水电系统!c. 硬件直通(SR-IOV/VFIO)—— 土豪专用。a. 全虚拟化(模拟设备)—— 最低效的方式。b. 半虚拟化(VirtIO)—— 高效合作。场景2:快递仓库(网络I/O)场景3:合租厨房(存储I/O)

2025-03-02 19:33:38 441

原创 为何linux所有I/O机制都无法避免在操作过程中拷贝文件描述符(fd)?

首先,我要回想一下常见的I/O机制,比如阻塞I/O、非阻塞I/O、I/O多路复用(如select、poll、epoll)、信号驱动I/O,以及异步I/O(如Linux的aio)。可能听说某些I/O模型可以减少数据拷贝,比如零拷贝技术,但这里用户关注的是文件描述符本身的拷贝,而不是数据拷贝。无论是阻塞I/O、非阻塞I/O、I/O多路复用(select/poll/epoll),还是异步I/O(AIO),所有I/O机制在执行过程中都需要通过系统调用将fd传递给内核,而这一过程必然涉及fd的拷贝。

2025-03-02 09:55:14 899

原创 ext4文件系统中extent机制

ext4的extent机制与其他特性如日志功能、延迟分配等相互配合,进一步提高了文件系统的性能和可靠性。延迟分配则可以根据文件的实际写入情况,更灵活地分配extent,提高磁盘空间的利用率。ext4中,extent的信息主要存储在inode和extent tree中。extent tree是一种用于组织和管理extent的树形结构,它可以快速定位文件的各个extent。在ext4中,文件的数据可以由一个或多个extent组成,每个extent代表一段连续的磁盘空间,这样可以更高效地管理文件数据的存储。

2025-03-01 21:40:59 247

原创 linux的tc工具设置和检测的属于软件层主动丢包

是 Linux 系统中的一个工具,全称是 Traffic Control,用于管理和控制网络流量的行为(如带宽限制、优先级调度、延迟模拟、丢包控制等)。根据 QoS 规则主动丢弃数据包时,这是由内核的流量控制逻辑直接处理的,属于 软件层的主动丢包,因此不会被网卡统计捕获。的规则作用于 内核协议栈的更高层(网络层或传输层)。)将流量分配到不同的队列(如基于 IP、端口、协议等)。队列),保障关键业务(如 VoIP)的低延迟。网卡(物理或虚拟网卡)的统计信息(如。的更多背景),请补充说明!

2025-03-01 10:36:01 375

原创 ARMv8架构缓存一致性协议同步速度评估

在 ARMv8 多核系统中,缓存一致性协议(如 MOESI)通常会在极短时间内(纳秒到微秒级)完成数据同步,因此 延迟超过 1ms 的概率极低。缓存一致性同步 10~1000 纳秒 通过总线协议(如 ACE)在多核间同步缓存行(典型值约 100~500 纳秒)。极端缓存争用 微秒级 多个核心频繁修改同一缓存行(False Sharing),导致总线带宽饱和。系统中断/调度延迟 微秒~毫秒级 高优先级中断抢占 CPU,或线程被操作系统调度挂起。)实测具体场景的延迟分布。一、正常情况下的延迟范围。

2025-03-01 09:24:53 173

原创 ARMv8架构多线程不的可见性不会实时可见但会最终可见

另外,还需要注意,C语言中的volatile关键字可以防止编译器优化,强制每次访问变量都从内存中读取,但它并不处理CPU缓存一致性的问题。总结一下,不考虑编译器优化的情况下,仅仅在两个线程中分别读写全局int变量,另一个线程可能不会立即看到变化,因为ARMv8的弱内存模型允许缓存不一致。用户的问题中提到的是int类型的全局变量,这是一个简单的数据类型,单次读写应该是原子的,但可见性问题仍然存在。因此,正确的做法是,在写入线程中使用存储-释放语义,确保写操作完成后,其他线程能通过加载-获取语义看到最新的值。

2025-03-01 09:14:43 135

原创 高效同步方式无需加锁RCU

需要注意避免使用过于专业的术语,保持解释的易懂性,同时确保覆盖用户可能关心的各个方面,比如性能、正确性、实现复杂度和适用场景。接下来,用户可能需要一个具体的实现示例,所以我应该提供C语言的代码示例,展示如何初始化、读、写和回收数据。另外,用户可能对RCU的内部机制有疑问,比如如何保证读操作的安全性和内存屏障的作用,这部分需要简明扼要地解释,但不过度深入,以免让用户感到困惑。最后,应该总结RCU的使用要点,帮助用户快速掌握关键点,并推荐进一步的学习资源,比如官方文档和相关书籍,方便用户深入理解。

2025-03-01 08:40:34 22

原创 大数据结构成员数据访问锁消耗大的解决方案

接下来,我需要考虑用户可能已经尝试过的方法,比如使用互斥锁(mutex)、读写锁(rwlock),或者尝试过无锁数据结构,但效果不佳。另外,用户可能对某些技术的实现细节和性能影响不太清楚,需要解释各种方案的优缺点,并提供示例代码,帮助他们更好地理解和应用。同时,需要提醒潜在的风险,比如无锁编程的复杂性、内存管理的挑战等,确保用户在选择方案时能够权衡利弊。这可能意味着他们的数据结构被频繁访问,或者锁的粒度太粗,导致线程间竞争激烈,影响性能。用户可能正在寻找一种替代锁的方法,或者优化现有锁的使用,以减少开销。

2025-03-01 08:33:25 124

原创 双缓冲机制指针实现传感器数据读写

读线程用relaxed加载原子变量,然后读取a和b,但这里存在数据竞争,因为release-acquire的同步仅作用于原子变量,而非原子变量a和b的读写没有保护,可能导致读线程看到旧值或撕裂值。写线程在完成写入后,使用release语义发布新的缓冲区指针,读线程使用acquire语义获取该指针,从而保证对非原子变量的写入在发布之前完成,读取在获取之后看到最新值。写线程在写入非原子变量后,以release存储原子变量,读线程以acquire加载原子变量,这样非原子变量的修改对读线程可见。

2025-03-01 08:24:22 36

原创 大结构体接收后只读让其他线程可见的轻量级方法

或者,可以采用一种双缓冲的机制。例如,写入线程在更新指针时使用release语义,而读线程在读取指针时使用acquire语义,这样可以保证当读线程获取到新指针时,之前的所有写入操作都已经完成,并且数据可见。不过,需要注意的是,结构体的更新可能不是原子的,所以即使指针的切换是原子的,如果写入线程在更新结构体的过程中被中断,读线程可能会看到部分更新的数据,导致不一致的状态。比如,在写入线程完成数据结构的更新后,使用某种内存屏障指令,确保写入的数据被刷新到主存,而读取线程在读取时也能从主存中获取最新的数据。

2025-02-28 22:47:58 57

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除