You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言多线程随机数组频数统计重复输出问题如何修复?

问题原因
  • 核心逻辑错误:创建了5个线程,且每个线程内部都独立执行了「生成随机数组→全量统计1~1000的频数→打印结果」的完整流程,相当于同一套逻辑重复执行了5次,自然会输出多次统计结果,且当前多线程没有做任务拆分,完全没有起到优化效率的作用。
  • 存在数组越界bug:main函数中定义的线程ID数组pthread_t thID[1]仅能存储1个线程ID,但是循环执行了5次pthread_create写入thID[0]~thID[4],会触发栈溢出,属于未定义行为,可能导致程序崩溃。
  • 同步逻辑冗余:添加的互斥锁、信号量完全没有起到任务协同的作用,只是把多线程的执行变成了串行排队执行同一套逻辑,反而拖慢了运行速度。
修复方案

要实现多线程优化效率,且仅输出一次统计结果,调整逻辑为:

  1. 主线程一次性生成20万长度的随机数组,作为共享数据给所有子线程读取
  2. 把1~1000的统计范围拆分给多个子线程,每个子线程只负责统计固定区间内的数字频数,写入共享的结果数组
  3. 所有子线程执行完毕后,主线程统一打印一次1~1000的统计结果
修正后的完整代码
#include <time.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

// 共享数据定义
int num[200000];
int result[1001] = {0}; // 存储1~1000的统计结果

// 线程参数:统计的起始和结束数字
typedef struct {
    int start;
    int end;
} ThreadArg;

void *countOccurences(void* args){
    ThreadArg *arg = (ThreadArg*)args;
    // 仅统计分配给自己的数字区间
    for (int i = arg->start; i <= arg->end; i++){
        int count = 0;
        for (int j = 0; j < 200000; j++){
            if (i == num[j]){
                count++;
            }
        }
        result[i] = count;
    }
    pthread_exit(NULL);
}

int main(){
    // 线程数可根据CPU核心数调整,这里用5个线程举例
    const int THREAD_NUM = 5;
    pthread_t thID[THREAD_NUM];
    ThreadArg args[THREAD_NUM];

    // 主线程一次性生成随机数组
    srand((unsigned) time(NULL));
    for (int i = 0; i < 200000; i++){
        num[i] = (rand() % 1000) + 1;
    }

    // 拆分统计任务:每个线程统计200个数字
    int step = 1000 / THREAD_NUM;
    for (int i = 0; i < THREAD_NUM; i++){
        args[i].start = i * step + 1;
        args[i].end = (i == THREAD_NUM -1) ? 1000 : (i+1)*step;
        pthread_create(&thID[i], NULL, countOccurences, &args[i]);
    }

    // 等待所有子线程统计完成
    for (int i = 0; i < THREAD_NUM; i++){
        pthread_join(thID[i],NULL);
    }

    // 主线程统一打印一次结果
    for (int i = 1; i <= 1000; i++){
        printf("%d occurs %d times \n", i, result[i]);
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:45:04