慎用volatile关键字

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情
看了某邮件列表里的大争论,一方支持使用volatile,一方反对。反方的理由如下:
1)volatile很怪异。嗯。如果对c++很熟悉,就会觉得volatile的确是个太与众不同的关键词。c++里面并没有线程啊同步啊之类的关键词,就一个volatile孤零零摆在那里。
2)volatile在大多数平台大多数编译环境下是不起作用,在少数起作用的场合代价高昂。这点我没有测试过哈,不过的确有很多时候,在“应该”使用volatile的地方忘记加volatile关键词,程序也跑得很好。
3)如果程序不使用volatile,就会失败,说明这个程序写得很吓人。(老外的原话比这幽默n倍)解释如下:需要同步,要么线程间有共享数据,要么是为了传递某个信号(比如开始信号,或者结束信号)。前者应该用临界区保护,给临界区对象性加volatile修饰完全是多次一举,因为没有哪个编译器会“过分聪明”到知道进出临界区(典型的是一个函数,有一个地址入参)不会影响到共享数据,所以在进临界区后,一定是从内存中读数据。后者的最大问题是效率低下。虽然自旋锁的实现采用了类似的方法,但是自旋锁使用的是原子操作,不需要volatile修饰。而且自旋锁只适用于快进快出的情况。如果一个线程等待的某个变量值发生变化需要较长时间,要么很浪费CPU时间(sleep时间较短),要么可能有比较长的延宕。注意如果不sleep,在极端情况下如等待线程优先级较高,可能会造成假死锁:该变量一直无法改变。高效合理地做法是使用内核提供的同步机制,把等待线程挂起来。

注意!:上面讨论的都是多线程环境。嵌入式环境或者大量使用中断的程序,volatile有着很重要的作用。

我有保留地同意反方的观点:要慎用volatile。不过当你明白自己在做什么的时候,也未必不能用哈哈。

C++volatile关键字解析 C++volatile关键字解析1.volatile2.volatile应用3.volatile常见问题4.volatile使用 1.volatilevolatile 修饰的变量,在对其进行读写操作时,会引发一些可观测的副作用。而这些可观测的副作用,是由程序之外的因素决定的。 2.volatile应用 (1)并行设备的硬件寄存器(如状态寄存器)。 假设要对一个设备进行初始化,此设备的某一个寄存器为0xff800000。 int *output = (unsigned int *)0xff80000 阅读详情

相关推荐

C/C++中volatile关键字详解

今天在修改XBase的ConnectionManager时,需要一个连接数组,但因为是多线程访问的,所以每个元素(是一个指针)都可能会发生变化。之前定义volatile一直没有一个系统的了解。这里找了一篇文章,感觉说的很全面 1. 为什么用volatile?     C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memor

xocoder's coding life 1448

C语言——副作用(side effects)和序列点(sequence points)

C语言——副作用(side effects)和序列点(sequence points)什么是副作用?什么是序列点? 什么是副作用? 英文原文:   Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects, which are changes in the state of th

weixin_44567318的博客 1775

volatile 修饰的变量"副作用/序列点"问题

这个问题是因为这个帖子而起, 也是这段代码有点不明白. 和自己预期的值不一样, 所以就编译反汇编看了下. 编译工具:  Code:blocks(GCC), CPU(Intel Core i3 32位), OS(windows 7 / 32bit). 参考书籍:  深入理解计算机系统(Bryant & Hallaron) 更多了解关于 volatile 可以参考: http://blog.cs

     KISSMonX 1613

C语言:volatile关键字的使用

volatile关键字的使用 volatile关键字简单的说就是禁止编译器优化,告诉编译器去该变量原本的位置中操作。 为加深理解可以先简单了解CPU内部运行流程:   CPU内部包含很多部分,其中就有高速缓冲存储器(cache)和寄存器。CPU的处理是速度非常快,比内存(RAM)的访问速度快得多,所以如果每次都是读取内存的数据之后再进行处理的话,性能就会降低了,而CPU访问内部的cache速度比内...

weixin_44498318的博客 286

剖析为什么在多核多线程程序中要慎用volatile关键字

这篇文章详细剖析了为什么在多核时代进行多线程编程时需要慎用volatile关键字。 主要内容有: 1. C/C++中的volatile关键字 2. Visual Studio对C/C++中volatile关键字的扩展 3. Java/.NET中的volatile关键字 4. Memory Model(内存模型) 5. Volatile使用建议 1. C/C++中的volatile关键

晴天的专栏 1099

在多核多线程程序中要慎用volatile关键字

这篇文章详细剖析了为什么在多核时代进行多线程编程时需要慎用volatile关键字。 主要内容有: 1. C/C++中的volatile关键字 2. Visual Studio对C/C++中volatile关键字的扩展 3. Java/.NET中的volatile关键字 4. Memory Model(内存模型) 5. Volatile使用建议 1. C/C++中的volatile关键

mail_cm的专栏 989

volatile 修饰数组_为什么在多线程程序中要慎用volatile关键字

今天为大家分享一篇文章关于Volatile使用建议以及操作方法的一篇文章,如果你没有了解之前一定要慎用,一定要认真学习完,再进行实战操作哦!本期内容概要1、存在缓存一致性2、缓存一致性3、线程可见性4、CPU指令重排序5、单例模式使用volatile结论:1. 线程之间可见性 2. 禁止指令重排序 一、存在缓存一致性分析下面程序的程序,哪个程序允许的速度更快1、一致性案例启动2个线...

weixin_39996908的博客 213

剖析为什么在多核多线程程序中要慎用volatile关键字

来源:http://www.parallellabs.com/2010/12/04/why-should-we-be-care-of-volatile-keyword-in-multithreaded-applications/ 剖析为什么在多核多线程程序中要慎用volatile关键字? 这篇文章详细剖析了为什么在多核时代进行多线程编程时需要慎用volatile关键字。 主要内容

JoshuaWang的专栏 347

volatile关键字的原理和要避免的误区

背景 最近做code review看到有的同学在承载缓存数据的变量里加了volatile关键字。想起来之前项目中也看到有的同学习惯在从配置中心获取的配置数据的变量上加volatile。今天就来探讨一下这个volatile加的有没有必要。 volatile关键字的作用 1>防止指令重排 2>禁用工作内存缓冲区,直接使用主内存。 经典使用场景 场景1 public static Singleton getInstance() { //第一次null检查 if (instan

qwe123147369的博客 248

volatile关键字用法

剖析为什么在多核多线程程序中要慎用volatile关键字? 转: http://www.parallellabs.com/2010/12/04/why-should-we-be-care-of-volatile-keyword-in-multithreaded-applications/ 这篇文章详细剖析了为什么在多核时代进行多线程编程时需要慎用volatile关键字。 主要内容有:

Daniel Ding 的专栏 970
上一篇: 算法题:求完美数
下一篇: 跨平台进程间同步
Runyon1982
博客等级 码龄18年 19粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值