作者icetofux ()
看板C_and_CPP
标题[问题] multi-thread计时的问题
时间Sat Jun 6 20:34:23 2020
开发平台(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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1591446865.A.E60.html
1F:→ Lipraxde: 这应该跟电脑当下忙不忙、OS scheduling 有关 06/06 21:12
2F:→ Lipraxde: 偶尔会超时应该算正常 06/06 21:12
3F:→ nh60211as: 刚刚测,跟楼上说得差不多 06/06 21:26
4F:→ nh60211as: 我正常跑你的code不会印东西,我限制cpu到ㄧ颗的话每次 06/06 21:27
5F:→ nh60211as: 都会印,应该是main跟timer一直交换cpu使用权 06/06 21:27
6F:→ icetofux: 刚刚试了一下,在timestamp的存取加入了std::memory_ord 06/06 21:47
7F:→ icetofux: er_consume跟std::memory_order_release就不再超时了。 06/06 21:47
8F:→ icetofux: 这样看起来好像又跟atomic有点关系@_@ 06/06 21:47
9F:→ Lipraxde: 看来是跟受到 memory order 的影响...你的电脑比较特殊 06/06 22:19
10F:→ Lipraxde: 吗? 06/06 22:19
11F:→ icetofux: 只是一般X86 PC而已,不过有趣的是即便加上memory order 06/06 23:58
12F:→ icetofux: 以後,在GDB online网站跑还是有超时现象,我的电脑上跑 06/06 23:58
13F:→ icetofux: 却不会。 06/06 23:58
14F:→ HSUFIT: 别在网站上测速度,我刚刚跑发现网站的稳定度很差 06/07 00:19
15F:→ HSUFIT: 你可以设定affinity让他们跑在同一个CPU上,再统计超时数 06/07 00:22
16F:→ Lipraxde: 试试看在 main 里的 while 加个 sleep,让它不要那麽频 06/07 10:10
17F:→ Lipraxde: 繁的 load 看看 06/07 10:10
18F:→ Lipraxde: 可能是它一直读导致另一个 thread 写不进去 06/07 10:24
19F:→ icetofux: 回Lipraxde,这个方法有效,感谢! 06/07 12:57