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
相关产品推荐
相关产品推荐

