多线程平均值计算函数结果异常,求问题排查与解决
问题分析与修复
核心问题点
- 遗漏数组首元素:代码中循环起始为
i=1l(疑似笔误,1l是long类型的1,此处应为1),直接跳过了数组list的第一个元素list[0](对应测试用例中的54),导致总和少了该值。 - 循环范围不完整:测试用例元素总数为8,
count=8,循环条件i<count仅遍历i=1到i=7共7个元素,正确应遍历全部8个元素(索引0到7)。 - 变量未初始化:
double sum;未赋予初始值0.0,属于未定义行为,可能导致计算结果随机异常。 - 冗余类型转换:
(double)(sum / count)中sum已是double类型,sum/count会自动提升为double,强制转换无必要。
修复后的代码
void *calculate_average(void *param) { int count = *(int *)param; int i; double sum = 0.0; // 初始化sum为0 average = 0.0; // 从索引0开始遍历所有count个元素 for (i = 0; i < count; i++) sum += list[i]; average = sum / count; // 直接计算平均值 pthread_exit(0); }
验证说明
修复后,测试用例的总和为54+15+25+45+60+93+68+57=417,平均值417/8=52.125,与正确结果一致。
内容的提问来源于stack exchange,提问作者Drift476
相关产品推荐
相关产品推荐

