[問題] thread會將值存在register中不寫回?

作者: Arton0306 (Ar藤)   2018-10-14 18:45:59
這個問題是出自"程式設計師的自我修養"這一本書
裡面28頁陳述了一個問題
x = 0;
Thread1 Thread2
lock(); lock();
x++; x++;
unlock(); unlock();
書上說可能thread1做完x++時,這個x=1的值還留在register中還沒寫回,
之後換thread2跑完,很久之後thread1才把此值寫回,最後x的值是1
但書上這個例子看起來就是一般multithread用mutex鎖住一段code的寫法,
目前也沒看過這種寫法發生錯誤
請問這個情況什麼時候會發生?
還是說平常在用的unlock會自動把register中的值flush出去?
我把28頁照片放上來
https://photos.app.goo.gl/QYG5LffdJLUC9PfA8
(特別查了一下著作權法,放個一頁應該是沒什麼問題@@)
著作權法第五十二條規定:「
為報導、評論、教學、研究或其他正當目的之必要,在合理範圍內,
得引用已公開發表之著作。」
作者: stupid0319 (徵女友)   2018-10-14 19:10:00
看不太懂,x應該是同一塊記憶體,怎會有flush的問題
作者: Lipraxde (Lipraxde)   2018-10-14 20:14:00
恩...應該 compiler 優化有問題才會像你說的這樣啊?有沒有前後文?
作者: descent (「雄辯是銀,沉默是金」)   2018-10-14 20:30:00
他後面有提到 volatile 和 memory barrier, page 29
作者: Arton0306 (Ar藤)   2018-10-14 20:38:00
我說flush是指寫出去到memory的意思29頁那個cpu自行換序的問題 我試過真的會發生但28頁這個我沒遇過再看一次 好像真的如同L大說的 這段是在講compiler的問題 所以compiler看到mutex夾住的要小心 應該是這意思@@我原本以為它是說code有問題 冏XD
作者: stupid0319 (徵女友)   2018-10-14 21:33:00
如果是留在暫存器中,也不能算做完x++吧書上意指lock前就把x值存進暫存器?唉,連記憶體到CPU暫存器的時間也要省
作者: Bencrie   2018-10-15 01:19:00
存取暫存器的時間遠小於記憶體啊 XD
作者: PkmX (阿貓)   2018-10-15 02:18:00
現在的C/C++有規範不同thread之間的memory model以std::mutex來說 unlock "synchronizes-with"下一個lockunlock前的side effects必須讓lock後的code看到如果編譯器沒有把x的值寫回記憶體的話就是做錯了
作者: steve1012 (steve)   2018-10-15 13:05:00
c++ 11以後要follow sequential consistency.
作者: PkmX (阿貓)   2018-10-16 09:44:00
seq_cst是atomic operation之間預設才有像上面那種bool isStop兩個threads同時寫還是UB除非你有用mutex等東西讓兩個讀寫有"happens-before"的關係
作者: jun0325 (俊)   2018-10-16 22:12:00
用volatile應該就會讓compiler每次都會寫回memory了吧
作者: PkmX (阿貓)   2018-10-17 10:47:00
照標準volatile和thread之間的synchronization是沒有關係的而且volatile也不一定是atomic access

Links booklink

Contact Us: admin [ a t ] ucptt.com