Chinaunix

标题: 也问一个volatile和mutex的问题 [打印本页]

作者: snofe    时间: 2008-03-10 13:38
标题: 也问一个volatile和mutex的问题
在多线程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 编辑 ]
作者: bugboy_bugboy    时间: 2008-03-10 13:45
标题: 回复 #1 snofe 的帖子
volatile只是告诉编译器不把读写的代码优化掉,不保证完整性.. 貌似要用MUTEX
作者: cugb_cat    时间: 2008-03-10 13:45
必须用锁吧。
作者: flw2    时间: 2008-03-10 22:39
LZ,我现在也很多解释不清楚,也有些地方没完全看完,你的情况肯定是要mutex
volatile在哪都是不需要的
改天再阅读一下标准
并不是是个多线程的全局变量都要volatile的
作者: cugb_cat    时间: 2008-03-10 22:42
volatile是针对编译器的,而编译器又没有多线程的概念,所以不能依靠编译器来互斥。
作者: Sorehead    时间: 2008-03-11 11:38
锁是肯定要使用的。

对于volatile的使用,不知道flw2和cugb_cat有多少心得,能够共享一下。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2