看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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的誤用,但目前還沒有 找到明確的方向。 期望有經驗的人可以指點一下。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.250.132.26 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1591446865.A.E60.html
Lipraxde: 這應該跟電腦當下忙不忙、OS scheduling 有關 06/06 21:12
Lipraxde: 偶爾會超時應該算正常 06/06 21:12
nh60211as: 剛剛測,跟樓上說得差不多 06/06 21:26
nh60211as: 我正常跑你的code不會印東西,我限制cpu到ㄧ顆的話每次 06/06 21:27
nh60211as: 都會印,應該是main跟timer一直交換cpu使用權 06/06 21:27
icetofux: 剛剛試了一下,在timestamp的存取加入了std::memory_ord 06/06 21:47
icetofux: er_consume跟std::memory_order_release就不再超時了。 06/06 21:47
icetofux: 這樣看起來好像又跟atomic有點關係@_@ 06/06 21:47
Lipraxde: 看來是跟受到 memory order 的影響...你的電腦比較特殊 06/06 22:19
Lipraxde: 嗎? 06/06 22:19
icetofux: 只是一般X86 PC而已,不過有趣的是即便加上memory order 06/06 23:58
icetofux: 以後,在GDB online網站跑還是有超時現象,我的電腦上跑 06/06 23:58
icetofux: 卻不會。 06/06 23:58
HSUFIT: 別在網站上測速度,我剛剛跑發現網站的穩定度很差 06/07 00:19
HSUFIT: 你可以設定affinity讓他們跑在同一個CPU上,再統計超時數 06/07 00:22
Lipraxde: 試試看在 main 裡的 while 加個 sleep,讓它不要那麼頻 06/07 10:10
Lipraxde: 繁的 load 看看 06/07 10:10
Lipraxde: 可能是它一直讀導致另一個 thread 寫不進去 06/07 10:24
icetofux: 回Lipraxde,這個方法有效,感謝! 06/07 12:57