免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2305 | 回复: 5
打印 上一主题 下一主题

也问一个volatile和mutex的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-10 13:38 |只看该作者 |倒序浏览
在多线程APP中,一个结构比如
typedef struct
{
    ...
    int end;
    ...
} SNODE;


end作为一个结束标识。
然后在thread A中循环读取判断,在thread B中对end 进行写修改。
那么在没有 任何机制保证的情况下,thread A可能不会读取到最新的值。

那么我现在有个问题,是不是直接在SNODE内部修饰 volatile int end;  就可以了?
还是修饰SNODE 结构?
( 我现在采用的是mutex来保护end读写的。)

上面是一个写,一个读的。
如果两个线程都可能 (读+写), 那么volatile 应该不能满足了,必须得用mutex. 对不对?

回复:
其实上面我有两个问题:
1. 就是n个读,一个写,一般用来做开关通知的,所有准确程度要求不高。这个情况下,volatile应该满足了。当然mutex也能满足要求。
2. 就是n个读,n个写,这样为了保证写的互斥,那volatile应该不能满足要求,必须得用mutex。

谢谢大家的回复。

[ 本帖最后由 snofe 于 2008-3-11 16:50 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-03-10 13:45 |只看该作者

回复 #1 snofe 的帖子

volatile只是告诉编译器不把读写的代码优化掉,不保证完整性.. 貌似要用MUTEX

论坛徽章:
0
3 [报告]
发表于 2008-03-10 13:45 |只看该作者
必须用锁吧。

论坛徽章:
0
4 [报告]
发表于 2008-03-10 22:39 |只看该作者
LZ,我现在也很多解释不清楚,也有些地方没完全看完,你的情况肯定是要mutex
volatile在哪都是不需要的
改天再阅读一下标准
并不是是个多线程的全局变量都要volatile的

论坛徽章:
0
5 [报告]
发表于 2008-03-10 22:42 |只看该作者
volatile是针对编译器的,而编译器又没有多线程的概念,所以不能依靠编译器来互斥。

论坛徽章:
0
6 [报告]
发表于 2008-03-11 11:38 |只看该作者
锁是肯定要使用的。

对于volatile的使用,不知道flw2和cugb_cat有多少心得,能够共享一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP