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