[問題] volatile和multi-thread 的觀念問題

看板C_and_CPP作者 (小嫩)時間6年前 (2017/09/19 00:43), 6年前編輯推噓8(807)
留言15則, 9人參與, 最新討論串1/1
一直對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不會同時執行, 這講法本身就是有破綻的"嗎 以上是我的盲點, 請各位給一點關鍵字讓我可以去搜尋一下 建立一下觀念 或是給予一些指證 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.218.202.250 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1505753032.A.DF7.html ※ 編輯: dreamboat66 (180.218.202.250), 09/19/2017 00:52:58

09/19 01:06, , 1F
volitile跟mutex應該沒關係吧 volitile是強迫一定要對
09/19 01:06, 1F

09/19 01:06, , 2F
該mem操作 否則在a=1;while(a)時 complier就認定恆為t
09/19 01:06, 2F

09/19 01:06, , 3F
rue就優化掉了
09/19 01:06, 3F

09/19 02:16, , 4F
你要不要說一下你怎麼用 mutex?
09/19 02:16, 4F

09/19 06:41, , 5F
volatile是用在如果該記憶體可能被外部更改(硬體 etc),
09/19 06:41, 5F

09/19 06:41, , 6F
我們必須確定我們取到的是確實的值,而非可能被優化的值
09/19 06:41, 6F

09/19 06:41, , 7F
09/19 06:41, 7F

09/19 10:47, , 8F
因為標準語焉不詳,volatile並不保證thread safety
09/19 10:47, 8F

09/19 10:47, , 9F
09/19 10:47, 9F

09/19 12:01, , 10F
volatile跟atomic應該是兩回事?
09/19 12:01, 10F

09/19 12:03, , 11F
volatile mutex atomic 是不同的意思
09/19 12:03, 11F

09/19 12:06, , 12F
一個是讓cpu裡的運算暫存跟記憶體同步
09/19 12:06, 12F

09/19 12:06, , 13F
一個是讓記憶體裡的資料在某段不要被其他執行緒改到
09/19 12:06, 13F

09/19 12:37, , 14F

09/23 22:49, , 15F
volitile在mcu下用的比較多
09/23 22:49, 15F
文章代碼(AID): #1Pl_V8tt (C_and_CPP)