免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 南海一钓叟
打印 上一主题 下一主题

那为大侠给俺讲讲cache和volatie变量的关系 [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
61 [报告]
发表于 2008-03-06 22:42 |只看该作者
强啊,好好学习了

论坛徽章:
0
62 [报告]
发表于 2008-03-07 10:08 |只看该作者
原帖由 sirouni 于 2008-3-2 18:29 发表
Do you volatile? should you?

by Dr. Kevin P. Dankwardt

Volatile is an ANSI C type modifier that is frequently needed in C code that is part of signal/interrupt handlers, threaded code, and  ...


看了这篇文章, 我倒是对volatile的理解更加糊涂了.

不同线程中对同一个变量的访问也需要使用volatile么?  这样的话,对我的打击也太大了点.

我以前可是经常在一个线程通过设置一个全局变量通知另外一个线程退出的, 我可重来没有设置过volatile阿.

论坛徽章:
0
63 [报告]
发表于 2008-03-07 10:17 |只看该作者
原帖由 飞雪横天 于 2008-3-7 10:08 发表


看了这篇文章, 我倒是对volatile的理解更加糊涂了.

不同线程中对同一个变量的访问也需要使用volatile么?  这样的话,对我的打击也太大了点.

我以前可是经常在一个线程通过设置一个全局变量通知另外一个 ...

看33楼

论坛徽章:
0
64 [报告]
发表于 2008-03-07 10:19 |只看该作者

回复 #62 飞雪横天 的帖子

c++标准“貌似”没有线程的概念,volatile主要是对signal、setjmp/longjmp等

对与你这个全局变量我觉得应该使用明确的线程同步原语,用volatile可能不够

论坛徽章:
0
65 [报告]
发表于 2008-03-07 10:32 |只看该作者
原帖由 飞雪横天 于 2008-3-7 10:08 发表


看了这篇文章, 我倒是对volatile的理解更加糊涂了.

不同线程中对同一个变量的访问也需要使用volatile么?  这样的话,对我的打击也太大了点.

我以前可是经常在一个线程通过设置一个全局变量通知另外一个线程退出的, 我可重来没有设置过volatile阿.



volatile只与编译器优化有关。但是,实际是否优化要看这段代码是否有优化空间,也就是有没有优化的必要 —— 当然,大多情况这决定于编译器智能程度,智能度高的编译器发现优化空间的能力就强,反之亦然。所以,你没有volatile修饰多线程共享的数据,程序运行也正常,说明编译器对与这个数据相关的代码没有优化。

论坛徽章:
0
66 [报告]
发表于 2008-03-07 10:37 |只看该作者
原帖由 tgbvc 于 2008-3-7 10:32 发表



volatile只与编译器优化有关。但是,实际是否优化要看这段代码是否有优化空间,也就是有没有优化的必要 —— 当然,大多情况这决定于编译器智能程度,智能度高的编译器发现优化空间的能力就强,反之亦然。 ...

不对,很多时候不是没有优化,是不能优化

论坛徽章:
0
67 [报告]
发表于 2008-03-07 10:40 |只看该作者
原帖由 flw2 于 2008-3-7 10:17 发表

看33楼


发现一个小问题,和主题无关,曾经讨论过
3楼 do_someting(如果是函数)可能会修改全局的i,而编译器不可能去检查这个事实,所以
while(i)
do_something();
不是例子

while(i) {
  /**/
}

发现一个小问题,和主题无关,曾经讨论过, 能够告诉我讨论的主题地址么?

还有这句话: 可能会修改全局的i,而编译器不可能去检查这个事实, ??????????
一个线程通知另外一个线程退出的模型就是这样的:
while(threadrunning == 0)
{
    pthread_exit(NULL);
}

如果全局变量threadrunning被修改, 而编译器不去检查这个事实, 那么如果优化掉的话, 那不是天下大乱了?

论坛徽章:
0
68 [报告]
发表于 2008-03-07 10:43 |只看该作者
原帖由 tgbvc 于 2008-3-7 10:32 发表



volatile只与编译器优化有关。但是,实际是否优化要看这段代码是否有优化空间,也就是有没有优化的必要 —— 当然,大多情况这决定于编译器智能程度,智能度高的编译器发现优化空间的能力就强,反之亦然。 ...



您的意思是说, 有的编译器可能给优化掉了, 有的编译器就不优化了, 那就是说我们这种设计最好是加上volatile了?

我基本上在这种情况下,没有见过通知线程退出的变量,需要用volatile

论坛徽章:
0
69 [报告]
发表于 2008-03-07 10:53 |只看该作者
原帖由 飞雪横天 于 2008-3-7 10:40 发表


发现一个小问题,和主题无关,曾经讨论过
3楼 do_someting(如果是函数)可能会修改全局的i,而编译器不可能去检查这个事实,所以
while(i)
do_something();
不是例子

while(i) {
  /**/
}

发现 ...


不是你上面这个意思

while(threadrunning == 0)
{
    pthread_exit(NULL);
}

编译器不能把threadrunning优化到寄存器,否则pthread_exit要是修改这个变量咋办?虽然pthread_exit不会修改你这个全局变量,但是编译器不知道这个事实,也没办法知道它是否修改

论坛徽章:
0
70 [报告]
发表于 2008-03-07 10:57 |只看该作者
原帖由 flw2 于 2008-3-7 10:37 发表

不对,很多时候不是没有优化,是不能优化



唉, 那多线程之间的共享变量到底如何处理?

以我的想法, 多线程下共享变量缓冲在cache当中, 由于所有线程共享内存,所以所有线程访问同一个变量时都是访问同一个cache,因此

应该不需要使用volatile, 因此在我的概念中,只有寄存器上的处理才需要用volatile, ?????????
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP