当前位置: 首页 > wzjs >正文

网站搭建策略与方法有哪些方面产品网站怎样做外部链接

网站搭建策略与方法有哪些方面,产品网站怎样做外部链接,北京门户网站建设,wordpress标签是什么1、概念 volatile 是 C/C 语言中的一个类型修饰符,用于告知编译器:该变量的值可能会在程序控制流之外被意外修改(如硬件寄存器、多线程共享变量或信号处理函数等),因此编译器不应对其进行激进的优化(如缓存…

1、概念

  volatile 是 C/C++ 语言中的一个类型修饰符,用于告知编译器:该变量的值可能会在程序控制流之外被意外修改(如硬件寄存器、多线程共享变量或信号处理函数等),因此编译器不应对其进行激进的优化(如缓存到寄存器或消除冗余读取)。

  在程序运行时,编译器通常会假设变量的值仅由当前线程或函数内的代码修改,并据此进行优化(如循环内变量提升、指令重排等)。然而,在嵌入式开发、设备驱动编程或多线程环境中,某些变量的值可能被外部因素(如硬件中断、信号处理器、其他线程)异步修改。此时,若未使用 volatile 修饰,编译器可能生成错误的优化代码,导致程序行为异常。

简而言之,volatile 的作用是:

  • 阻止编译器优化:强制每次访问变量时都从内存读取,而非使用寄存器中的缓存值;
  • 确保内存可见性:防止编译器重排或省略对变量的访问,保证操作顺序符合预期;
  • 适用于特殊场景:如硬件寄存器映射、信号处理、多线程共享变量(需配合其他同步机制)

volatile 并不解决所有并发问题(如原子性),但它是底层编程中确保正确内存访问的重要工具。

2、代码测试

下面是在 ARM 平台的 C 语言测试,因为 ARM 是弱内存模型,更容易复现问题。

/**  volatile_test.c*/#include <stdio.h>
#include <signal.h>
#include <unistd.h>// 全局变量,使用或不使用volatile修饰
int flag = 0;  // 尝试改为 volatile int flag = 0; 观察不同结果void handler(int sig) {flag = 1;printf("Signal handler set flag to 1\n");
}int main() {signal(SIGALRM, handler);alarm(1);  // 1秒后发送SIGALRM信号while(!flag) {// 空循环等待flag变化}printf("Main loop detected flag change\n");return 0;
}

2.1 测试结果

不使用 volatile 关键字,程序会卡死在 while 循环中:

liang@liang-virtual-machine:~/cfp$../arm-none-linux-gnueabi-gcc -O3 -g -o volatile_test volatile_test.c
liang@liang-virtual-machine:~/cfp$ ./volatile_test
Signal handler set flag to 1

使用 volatile,程序正常退出

liang@liang-virtual-machine:~/cfp$../arm-none-linux-gnueabi-gcc -O3 -g -o volatile_test volatile_test.c
liang@liang-virtual-machine:~/cfp$ ./volatile_test
Signal handler set flag to 1
Main loop detected flag change
liang@liang-virtual-machine:~/cfp$

2.2 反汇编

不使用 volatile:

liang@liang-virtual-machine:~/cfp$../arm-none-linux-gnueabi-objdump -S volatile_test
......
int main() {83cc:	e92d4010 	push	{r4, lr}signal(SIGALRM, handler);83d0:	e59f1030 	ldr	r1, [pc, #48]	; 8408 <main+0x3c>83d4:	e3a0000e 	mov	r0, #14	; 0xe83d8:	ebffffc5 	bl	82f4 <_init+0x38>alarm(1);  // 1秒后发送SIGALRM信号83dc:	e3a00001 	mov	r0, #1	; 0x183e0:	ebffffc9 	bl	830c <_init+0x50>83e4:	e59f3020 	ldr	r3, [pc, #32]	; 840c <main+0x40>83e8:	e5932000 	ldr	r2, [r3]		      ; 从内存读取 flag 值到 r283ec:	e3520000 	cmp	r2, #0	; 0x0		  ; 比较 r2 的值83f0:	1a000000 	bne	83f8 <main+0x2c>	  ; 如果 r2≠0,跳转到 83f8 位置83f4:	eafffffe 	b	83f4 <main+0x28>      ; 无条件跳转到自身(无限循环)while(!flag) {// 空循环等待flag变化}printf("Main loop detected flag change\n");83f8:	e59f0010 	ldr	r0, [pc, #16]	; 8410 <main+0x44>83fc:	ebffffc5 	bl	8318 <_init+0x5c>return 0;
}
......

  可以看到,编译器对 while 循环做了优化。编译器只在循环开始前读取一次 flag 的值到寄存器 r2。编译器认为 flag 在循环内不会被修改,之后循环中不再重新从内存读取 flag。同时,直接做了一个无条件跳转到自身的优化:

83f4:	eafffffe 	b	83f4 <main+0x28>      ; 无条件跳转到自身(无限循环)

  而对比使用 volatile 关键字,可以看到编译器没有对 while 循环做优化,每次循环都重新读取 flag 的值:

liang@liang-virtual-machine:~/cfp$../arm-none-linux-gnueabi-objdump -S volatile_test
......
int main() {83cc:	e92d4010 	push	{r4, lr}signal(SIGALRM, handler);83d0:	e59f102c 	ldr	r1, [pc, #44]	; 8404 <main+0x38>83d4:	e3a0000e 	mov	r0, #14	; 0xe83d8:	ebffffc5 	bl	82f4 <_init+0x38>alarm(1);  // 1秒后发送SIGALRM信号83dc:	e3a00001 	mov	r0, #1	; 0x183e0:	ebffffc9 	bl	830c <_init+0x50>83e4:	e59f201c 	ldr	r2, [pc, #28]	; 8408 <main+0x3c>while(!flag) {83e8:	e5923000 	ldr	r3, [r2]			; 每次循环都重新读取flag83ec:	e3530000 	cmp	r3, #0	; 0x0		; 如果≠0跳转到退出83f0:	0afffffc 	beq	83e8 <main+0x1c>	; 继续循环// 空循环等待flag变化}printf("Main loop detected flag change\n");83f4:	e59f0010 	ldr	r0, [pc, #16]	; 840c <main+0x40>83f8:	ebffffc6 	bl	8318 <_init+0x5c>return 0;
}
......
http://www.dtcms.com/wzjs/560293.html

相关文章:

  • 做网站外包公司名称大全wordpress 提交评论
  • 做网站什么配置够用大型网站建站公司 上市
  • 新网站前期seo怎么做加强门户网站建设的通知
  • 烟台芝罘区住房建设局网站百度公司总部在哪里
  • ps做网站广告logo网站出售商品建设
  • 建筑设计门户网站网站开发公众号开发
  • 阿里巴巴网站导航栏怎么做无锡高端网站建设开发
  • 网站推广的方式国内时事新闻2021最新
  • 百元建站做微信的微网站费用
  • 电子商务网站平台建设方案怎么创建网站建设
  • 广州网站建设公司小程序广告推广网站怎么做
  • 网站建设如何找客户社区电商小程序模板包含哪些
  • 德语网站建设甘肃住房建设厅网站
  • 有网络网站打不开品质最好的购物平台
  • 怎么样做兼职网站济南做网站创意
  • 太原网站建设方案策划高端的咨询行业网站策划
  • 如何制作产品网站合购WordPress
  • 建站公司兴田德润在哪里王业富
  • 网站开发人员考核指标企业快速建站
  • 网站建设费用摊销多少年创新设计案例100个
  • 电子商务平台网站建造长沙是什么时候建立的
  • 网站显示后台登陆链接做公司网站排名
  • 论坛型网站开发网上智慧团建网站登录
  • 高仿卡西欧手表网站赤峰网站开发公司
  • 天津企业网站制作域名注册了 如何做网站
  • 网站的功能和作用是什么地方新闻门户网站源码
  • 担保交易网站开发潍坊网站建设wancet
  • 河北响应式网站建设哪家有苏州优化方式
  • 永康做网站的263企业邮箱登官网
  • 专业定制网站制作公司北京网页设计公司招聘