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

看板C_and_CPP作者時間4年前 (2020/06/06 20:34), 編輯推噓0(0019)
留言19則, 4人參與, 4年前最新討論串1/1
開發平台(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

06/06 21:12, 4年前 , 1F
這應該跟電腦當下忙不忙、OS scheduling 有關
06/06 21:12, 1F

06/06 21:12, 4年前 , 2F
偶爾會超時應該算正常
06/06 21:12, 2F

06/06 21:26, 4年前 , 3F
剛剛測,跟樓上說得差不多
06/06 21:26, 3F

06/06 21:27, 4年前 , 4F
我正常跑你的code不會印東西,我限制cpu到ㄧ顆的話每次
06/06 21:27, 4F

06/06 21:27, 4年前 , 5F
都會印,應該是main跟timer一直交換cpu使用權
06/06 21:27, 5F

06/06 21:47, 4年前 , 6F
剛剛試了一下,在timestamp的存取加入了std::memory_ord
06/06 21:47, 6F

06/06 21:47, 4年前 , 7F
er_consume跟std::memory_order_release就不再超時了。
06/06 21:47, 7F

06/06 21:47, 4年前 , 8F
這樣看起來好像又跟atomic有點關係@_@
06/06 21:47, 8F

06/06 22:19, 4年前 , 9F
看來是跟受到 memory order 的影響...你的電腦比較特殊
06/06 22:19, 9F

06/06 22:19, 4年前 , 10F
嗎?
06/06 22:19, 10F

06/06 23:58, 4年前 , 11F
只是一般X86 PC而已,不過有趣的是即便加上memory order
06/06 23:58, 11F

06/06 23:58, 4年前 , 12F
以後,在GDB online網站跑還是有超時現象,我的電腦上跑
06/06 23:58, 12F

06/06 23:58, 4年前 , 13F
卻不會。
06/06 23:58, 13F

06/07 00:19, 4年前 , 14F
別在網站上測速度,我剛剛跑發現網站的穩定度很差
06/07 00:19, 14F

06/07 00:22, 4年前 , 15F
你可以設定affinity讓他們跑在同一個CPU上,再統計超時數
06/07 00:22, 15F

06/07 10:10, 4年前 , 16F
試試看在 main 裡的 while 加個 sleep,讓它不要那麼頻
06/07 10:10, 16F

06/07 10:10, 4年前 , 17F
繁的 load 看看
06/07 10:10, 17F

06/07 10:24, 4年前 , 18F
可能是它一直讀導致另一個 thread 寫不進去
06/07 10:24, 18F

06/07 12:57, 4年前 , 19F
回Lipraxde,這個方法有效,感謝!
06/07 12:57, 19F
文章代碼(AID): #1UsurHvW (C_and_CPP)