[問題] 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