html个人网站策划书沈阳网站优化 唐朝网络

张小明 2026/1/13 8:40:01
html个人网站策划书,沈阳网站优化 唐朝网络,如何建设一个专业的网站,霞浦建设局总规网站嵌入式C编程时#xff0c;有一个奇怪的关键字volatile#xff0c;这到底有什么用呢#xff1f;volatile与编译器首先来看这样一段代码#xff1a;int busy 1; void wait() { while(busy) { ; }}编译一下#xff0c;注意#xff0c;这里使用O2优化#xff1a;让…嵌入式C编程时有一个奇怪的关键字volatile这到底有什么用呢volatile与编译器首先来看这样一段代码int busy 1; void wait() { while(busy) { ; }}编译一下注意这里使用O2优化让我们仔细看看生成的这段汇编wait: mov eax, DWORD PTR busy[rip].L2: test eax, eax jne .L2 retbusy: .long 1其中L2这一段即为while循环这段指令是经过编译器优化的可以看到决定能否跳出循环是通过检查寄存器eax来完成的而没有检查变量busy所在内存的真实内容。注意对于这段代码来说这里的优化是正确的但问题是如果还有其它代码修改了变量busy那么这里的优化会导致其它代码对变量busy的修改根本就不能生效就像这样int busy 1;// 该函数在A线程中执行void wait() { while(busy) { ; }}// 该函数在B线程中执行void signal() { busy 0;}如果wait函数中while循环对应的机器指令仅仅从寄存器中读取数据那么即使B线程的signal函数修改了busy变量也不能让wait函数从循环中跳出来。如果你对busy变量使用volatile修饰生成的指令就变成这样了wait:.L2: mov eax, DWORD PTR busy[rip] test eax, eax jne .L2 retbusy: .long 1注意看此时L2这一段每次都从busy变量所在的内存中读取数据并存放在eax然后再去判断这样就能确保每次都能读取到busy变量的最新值。实际上你可以把寄存器eax当做busy所在内存的cache当cache(寄存器)和内存中的数据一致时不会有任何问题但当cache与内存中的数据不一致时(也就是内存已被更新但cache保存的还是旧数据)程序的运行往往出乎预料。除了多线程的例子还有一类就是signal handler以及硬件修改该变量(用C语言与硬件交互式时经常遇到)如果编译器生成文章开头那样的指令那么等待线程将检测不到signal handler或者硬件对变量的修改。因此在这里我们需要告诉编译器“不要耍小聪明不要只从寄存器中读数据这个变量可能在其它地方已经被修改了使用时从内存中获取最新数据”。现在是时候简单总结一下了volatile仅仅阻止编译器试图去优化对变量的读取操作。volatile与多线程一定要注意volatile仅仅确保变量的可见性但和变量的原子访问没有半毛钱关系这是两个完全不同的任务。假设有一个非常复杂的结构体struct foo:struct data { int a; int b; int c; ...};volatile struct data foo; void thread1() { foo.a 1; foo.b 2; foo.c 3; ...}void thread2() { int a foo.a; int b foo.b; int c foo.c; ...}你仅仅用volatile去修饰变量foo只是确保了当该变量被thread1修改后我们能在thread2中读取到最新值但是这解决不了多线程并发读写需要原子访问foo的问题。确保变量原子性访问一般都采用锁当使用锁时锁本身就包含了volatile提供能力即确保变量的可见性因此当使用锁时没有必要使用volatile。volatile与memory order有的同学可能会想如果我想用volatile修饰的变量没有那么复杂仅仅是一个int就像这样volatileint busy 0;A线程读取busy变量B线程更新busy变量当A检测到busy变化后执行特定操作这样可行吗既然通过volatile修饰后可以确保每次都从内存中读取busy那么应该可以这样使用吧。然而计算机在概念上可能相对简单些但在工程实践中是复杂的。我们知道由于CPU与内存之间的速度差异非常大CPU与内存之间有一层cacheCPU其实并没有直接读取内存cache的存在会让问题复杂起来限于篇幅与本文主题这里不再展开。为优化内存读写CPU可能会对内存读写操作进行指令重排reordering带来的后果就是假设在线程1中先后执行第N行代码与第N1行代码但在线程2看来却是第N1行代码先生效假设X的初始值为0Y的初始值为1线程1 线程2X 10 if (!busy)busy 0; Y X;当线程2检测到busy为0后读取X的值此时读取到的X值可能为0。为解决这一问题我们需要的不是volatilevolatile解决不了reordering问题我们需要的是内存屏障memory barrier。内存屏障是一类机器指令该指令对处理器在该屏障指令之前与之后的内存操作进行了限制确保不会出现重排问题。而内存屏障带来的效果依然能够涵盖volatile提供的功能因此也不需要volatile。------------END------------不靠 MCU用 FPGA DAC 实现可调信号源嵌入式多线程从能跑到稳定的关键一步!
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设技术代码网站制作 成功案例

用IndexTTS 2.0一周做出整套音频课:声音也能“工业化生产”了? 在知识付费行业卷到极致的今天,内容更新速度几乎成了生死线。你有没有遇到过这种情况:精心打磨的课程脚本写好了,PPT也设计得滴水不漏,结果卡…

张小明 2026/1/11 14:07:27 网站建设

网站建设仟首先金手指15高档女装品牌前十名

第一章:PHP 8.7 性能基准测试的行业背景 随着现代Web应用对响应速度和资源效率的要求日益提升,PHP作为长期占据服务器端脚本语言主流地位的技术栈,其版本迭代中的性能优化成为开发者社区与企业架构师关注的核心议题。PHP 8.7虽尚未正式发布&a…

张小明 2026/1/12 12:31:18 网站建设

访问不了网站目录中的网页公司 网站建设 简介

YOLOv5-Net 在.NET环境下的快速部署指南 【免费下载链接】yolov5-net 项目地址: https://gitcode.com/gh_mirrors/yol/yolov5-net YOLOv5-Net是一个基于C#语言实现的开源目标检测框架,它让开发者在.NET平台上也能轻松使用YOLOv5的强大功能。本文将详细介绍如…

张小明 2026/1/12 18:46:14 网站建设

常青藤网站建设企业建设电商网站

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2026/1/13 4:09:41 网站建设

哈尔滨餐饮加盟网站建设网站的首页面设计

第一章:C语言嵌入式开发进阶之路(RISC-V跨平台适配全解析)在现代嵌入式系统开发中,RISC-V架构因其开源、模块化和可扩展性,正逐步成为主流选择。使用C语言进行RISC-V平台的开发,不仅需要掌握传统的嵌入式编…

张小明 2026/1/12 14:34:03 网站建设

万网空间最多放几个网站泛微e8做网站门户

在当今的微服务架构中,异步编程已成为提升系统性能的关键手段。然而,当开发者在使用线程池执行异步任务时,传统ThreadLocal无法跨越线程边界传递上下文信息,导致用户会话、追踪ID、认证令牌等关键数据在异步操作中神秘消失。Trans…

张小明 2026/1/8 7:38:06 网站建设