[问题] volatile和multi-thread 的观念问题

楼主: dreamboat66 (小嫩)   2017-09-19 00:43:50
一直对volatile没有很明确知道用途
查一些资料 多半都是举例用volatile让compiler不会对他最佳化 让他不要拿cache数值
但这实在有点抽象, 实际上如果要使用 有没有更具体一点的使用情境呢?
之前有听到一个说法 想请问各位是否有错
假设有个global变量 int a;
两条thread都会去r/w这个a
假设我能确定这两个thread执行的时候完全是互斥(我没有用任何sync手段)

int a;
int main(){
a = 1;
std::thread t([](){cout<<a<<endl;};
}
乍看这两条thread绝对无overlap
但我是不是也不能保证取得的a 值是正确的?
如果不能保证
是不是volatile int a;就能解这个问题?
另外就是如果我用mutex来手动让它互斥, 为什么就能保证取得的值正确呢?
如果我土炮写一个 spin lock来做互斥(没有使用系统提供任何API单纯while spin)
是不是也可能没办法保证能解决"取得正确的值"这件事(非要使用系统的api才能?)
如果以上观念大致正确,
是不是之后看到有人写code 没有用mutex or atomic 而是说
这两条thread不会同时执行, 这讲法本身就是有破绽的"吗
以上是我的盲点, 请各位给一点关键字让我可以去搜寻一下
建立一下观念
或是给予一些指证
谢谢
作者: super6602 (Ace)   2017-09-19 01:06:00
volitile跟mutex应该没关系吧 volitile是强迫一定要对该mem操作 否则在a=1;while(a)时 complier就认定恒为true就优化掉了
作者: steve1012 (steve)   2017-09-19 02:16:00
你要不要说一下你怎么用 mutex?
作者: sorryla (Mr.东)   2017-09-19 06:41:00
volatile是用在如果该内存可能被外部更改(硬件 etc),我们必须确定我们取到的是确实的值,而非可能被优化的值。
作者: littleshan (我要加入剑道社!)   2017-09-19 10:47:00
因为标准语焉不详,volatile并不保证thread safety请见 https://goo.gl/GGRAqd
作者: james732 (好人超)   2017-09-19 12:01:00
volatile跟atomic应该是两回事?
作者: Raymond0710 (雷门)   2017-09-19 12:03:00
volatile mutex atomic 是不同的意思
作者: chuegou (chuegou)   2017-09-19 12:06:00
一个是让cpu里的运算暂存跟内存同步一个是让内存里的资料在某段不要被其他执行绪改到
作者: nsc (...)   2017-09-19 12:37:00
作者: jasonkey123 (jasonkey123)   2017-09-23 22:49:00
volitile在mcu下用的比较多

Links booklink

Contact Us: admin [ a t ] ucptt.com