[問題] multi-thread計時的問題

作者: icetofux   2020-06-06 20:34:23
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux/Win10
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)

問題(Question):
如下列網址的程式碼。
1.我建立一個thread,每50mS把目前的time_point作為timestamp儲存至
atomic型態的變數中。
2.在主thread中,持續觀測timestamp與現在時間的時間差。
餵入的資料(Input):

預期的正確結果(Expected Output):
每次觀測timestamp與現在時間的時間差不會大於50mS。
錯誤結果(Wrong Output):
偶發性的會出現大於50mS的時間差,其時間大於50mS幾十個mS。
如果要解釋為處理while loop中其他動作的時間,似乎又有點太長了。
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
https://onlinegdb.com/HypIjZKnL
補充說明(Supplement):
猜測問題可能是出自於我對std::atomic或是std::chrnon的誤用,但目前還沒有
找到明確的方向。
期望有經驗的人可以指點一下。
作者: Lipraxde (Lipraxde)   2020-06-06 21:12:00
這應該跟電腦當下忙不忙、OS scheduling 有關偶爾會超時應該算正常
作者: nh60211as   2020-06-06 21:26:00
剛剛測,跟樓上說得差不多我正常跑你的code不會印東西,我限制cpu到ㄧ顆的話每次都會印,應該是main跟timer一直交換cpu使用權
作者: icetofux   2020-06-06 21:47:00
剛剛試了一下,在timestamp的存取加入了std::memory_order_consume跟std::memory_order_release就不再超時了。這樣看起來好像又跟atomic有點關係@[email protected]
作者: Lipraxde (Lipraxde)   2020-06-06 22:19:00
看來是跟受到 memory order 的影響...你的電腦比較特殊嗎?
作者: icetofux   2020-06-06 23:58:00
只是一般X86 PC而已,不過有趣的是即便加上memory order以後,在GDB online網站跑還是有超時現象,我的電腦上跑卻不會。
作者: HSUFIT (FireDance)   2020-06-07 00:19:00
別在網站上測速度,我剛剛跑發現網站的穩定度很差你可以設定affinity讓他們跑在同一個CPU上,再統計超時數
作者: Lipraxde (Lipraxde)   2020-06-07 10:10:00
試試看在 main 裡的 while 加個 sleep,讓它不要那麼頻繁的 load 看看可能是它一直讀導致另一個 thread 寫不進去
作者: icetofux   2020-06-07 12:57:00
回Lipraxde,這個方法有效,感謝!

Links booklink

Contact Us: admin [ a t ] ucptt.com