volatile变量使用的疑惑

kong_mdmq 2012-08-21 10:54:10
是这样的 我是用vc2005创建的一个基于对话框的程序 在主对话框(即主线程)的cpp文件中定义了30几个全局变量 这些变量的值会在子对话框中更改 同时我在主对话框的cpp文件中创建了几个线程 这些线程会使用这些变量的值,但不会写。
那么现在我需要将这些变量定义为volatile变量吗 因为我的理解是子对话框也是属于主线程的,那么只有主线程可以更改这些变量的值,而其他的线程只是读这些变量的值,不能更改他们的值。所以我觉得没必要定义为volatile,不知道大家有什么看法
...全文
253 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
breezes2008 2012-08-24
  • 打赏
  • 举报
回复
多线程访问全局变量加锁即可。
titer1 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
比如:
while(x)// 这个x 如果没volatile的话,编译器可能把他存入eax,然后每次检查eax是不是为0.有了volatile后编译器每次都重新读x值。
{
}
[/Quote]
这个例 ,我没有想到过,有意思。
楼主说到的问题 如果编译器没有优化就不会发生。
BYD123 2012-08-23
  • 打赏
  • 举报
回复
应该不会影响的。
schlafenhamster 2012-08-21
  • 打赏
  • 举报
回复
比如:
while(x)// 这个x 如果没volatile的话,编译器可能把他存入eax,然后每次检查eax是不是为0.有了volatile后编译器每次都重新读x值。
{


}
hdg3707 2012-08-21
  • 打赏
  • 举报
回复
加上可靠一些,因为优化级别不一样,编绎后的结果也不一样,加上这个关键字后代码移植的可靠性也高
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:

volatile是声明变量会被外部改变,防止编译器优化。一般不用汇编的话用不着。

但是很多位置都说 使用多线程的时候 如果多个线程都需要共享的全局变量需要加上volatile
[/Quote]
是有这样一种可能,当一个线程修改了这个变量的值,但这个值的改变只
是体现在寄存器里而没有反映到内存中。这时你从另一个线程中取到的值
就是没有被修改过的。如果你觉得在你的 程序中可能会出现这样一种情况
就要加volatile
kong_mdmq 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

volatile是声明变量会被外部改变,防止编译器优化。一般不用汇编的话用不着。
[/Quote]
但是很多位置都说 使用多线程的时候 如果多个线程都需要共享的全局变量需要加上volatile
ndy_w 2012-08-21
  • 打赏
  • 举报
回复
volatile是声明变量会被外部改变,防止编译器优化。一般不用汇编的话用不着。
schlafenhamster 2012-08-21
  • 打赏
  • 举报
回复
"30多个变量我加上volatile 对于程序的运行速度应该也不会什么影响吧。"
难说,还是多试试
IVERS0N 2012-08-21
  • 打赏
  • 举报
回复
防止有个寄存器拷贝
kong_mdmq 2012-08-21
  • 打赏
  • 举报
回复
因为我其他的线程都是读这些变量值,然后这些变量内部进行互相的比较,并没有涉及到while(x)或者这些变量与常量比较,我个人感觉不会把这些变量存入寄存器,然后对这些变量写的操作都是出现在主线程中(各个对话框中,所以我个人觉得没必要用volatile。
不过就算这30多个变量我加上volatile 对于程序的运行速度应该也不会什么影响吧。不过还没有长时间运行试过。
不知道以大家的经验来看有没有必要加上volatile。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧