You need to enable JavaScript to run this app. C++多线程程序输出异常:求和测试得到非预期值与计时错误
优惠活动
大模型
产品
解决方案
定价
更多

C++多线程程序输出异常:求和测试得到非预期值与计时错误

代码问题拆解

重复输出求和结果的原因

  • 你在代码中触发了两次完全相同的求和流程:第一次是创建t1线程执行funcSum(start, end),等线程通过join()执行完毕后,在主流程里又直接同步调用了一次funcSum(start, end)。
  • 两次计算的参数完全一致,得到的结果都是4050045000,再加上funcSum内部输出结果时没有添加换行、分隔符,两次输出的内容就直接拼接成了你看到的连串数字40500450004050045000。
  • 你原本期望只输出一次求和结果,本质是遗留了主流程里的冗余调用:如果是要测试多线程执行逻辑,正常应该二选一执行单线程或多线程的计算流程,而不是两次都跑。

显示运行时长为0秒的原因

  • 时间差计算方向写反了:代码里计算差值用的是startTime - stopTime,正确的逻辑应该是结束时间减去开始时间,也就是stopTime - startTime。反向计算得到的是负的时间差,本身的数值就达不到1秒的量级,转成整数秒时会被直接截断为0。
  • 计时精度选择不合理:0到90000的整数累加计算量极小,整个程序流程的耗时连1毫秒都不到,就算修正了时间差的方向,用seconds作为单位也完全捕捉不到这么短的耗时,最终结果依然会显示为0。如果要测量这类短耗时操作,需要换成milliseconds甚至microseconds的精度来计算。

附带的潜在问题

  • 两个执行路径(子线程、主线程)直接共用cout输出没有加同步保护,这次因为执行时序刚好是串行完成没有出现异常,但如果两个输出操作交叉执行,很容易出现字符混杂的乱码输出。
  • 当前的join()逻辑是等子线程跑完再执行主线程的函数调用,全程是串行执行,完全没有发挥多线程的并行优势,本质只是连续跑了两次相同的计算任务。

修正参考

  • 要实现仅输出一次求和结果的目标,直接删掉t1.join()后面那次同步调用funcSum(start, end)的代码即可。
  • 把时间差计算改成stopTime - startTime,同时把计时精度换成milliseconds,就能读取到比较准确的短耗时数值。
  • 如果后续要验证多线程的性能优势,可以把整个求和范围拆成多个独立的子区间,分给不同的线程并行计算,最后合并所有子区间的结果,而不是让多个线程重复执行完全相同的计算任务。

内容的提问来源于stack exchange,提问作者Arun Suryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 15:36:04