【问题标题】:C segmentation fault threadsC 分段错误线程
【发布时间】:2022-01-10 17:24:55
【问题描述】:

这是一个用 C 语言编写的程序,使用 gcc filename.c -o file -pthread 可以很好地编译。但是,当我运行程序时,它告诉我存在分段错误,我不知道如何修复它。该程序旨在在数组中生成随机整数,然后比较使用不同数量的线程来查找程序到达迭代所需的 10 个最大数字和 10 个最小数字所需的时间。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

#define arraySize 10000
#define lval 0 
#define hval 50000
#define maxthread 100

int num[arraySize];
int maxs[maxthread];
int mins[maxthread];
int threadsize;
int threadnum = 0;

void fill(){
    int i;
    int tmp[hval];
    for(i = lval;i < hval;i++)tmp[i] = i;
    for(i = 0;i < arraySize;i++){
        int t= i + rand()%(hval - 1);
        int temp = tmp[i];
        tmp[i] = tmp[t];
        tmp[t] = temp;
        num[i] = tmp[i];
    }
}

void print(){
    int i;
    printf("First 10 Numbers are: \n");
    for(i = 0;i < 10;i++)printf("\t%d\n",num[i]);
    printf("\n\nLast 10 Numbers: \n");
    for(i = (arraySize - 10);i < arraySize;i++)printf("\t%d\n",num[i]);
}

void *getminmax(void *arg){
    int i,n = threadnum++;
    int max = lval,min = hval;
    for(i = n*(arraySize / threadsize);i < (n + 1)*(arraySize / threadsize);i++){
        if (num[i] > max)max = num[i];
        if (num[i] < min)min = num[i];
    }
    maxs[n] = max;
    mins[n] = min;
    printf("Threads:%d Min: %d Max%d Thread Num: %d\n",threadsize,min,max,n);
}

void search(){
    int max = lval, min = hval;
    int i;
    int start = clock();
    pthread_t threads[threadsize];
    for(i = 0;i < threadsize;i++)
        pthread_create(&threads[i],NULL,getminmax,(void*)NULL);
    for(i = 0;i < threadsize;i++)
        pthread_join(threads[i],NULL);
    for(i = 0;i < threadsize;i++){
        if(maxs[i] > max)max = maxs[i];
        if(mins[i] < min)min = mins[i];
    }
    int end = clock();
    int d = end - start;
    printf("Threads %d Min: %d Time Taken: %d \n\n",threadsize,min,max,d);
}

int main(){
    fill();
    print();
    threadsize = 2;
    threadnum = 0;
    search();
    threadsize = 10;
    threadnum = 0;
    search();
    threadsize = 100;
    threadnum = 0;
    search();
    return 0;
}

【问题讨论】:

  • 我不知道如何解决它”。学习调试的好时机。在调试器中运行您的程序。至少它会立即为您提供触发 seg 错误的确切代码行。也可以在程序运行时使用它来跟踪程序。
  • int t= i + rand()%(hval - 1); 最坏的情况,i==9999rand()%(hval - 1)==49999(虽然取决于 stdlib.h 中定义的RAND_MAX,所以可能小于 49999),但似乎合理的那些加在一起可以> 49999,所以tmp[t] 将越界,调用UB。您可以在t 上放置一个条件断点以查看这是否正确,或者尝试找出rand() 可以返回的最大值。您还需要seed rand()

标签: c segmentation-fault pthreads


【解决方案1】:

您的程序中几乎没有明显的错误。

  1. 正如 yano 所指出的,t = i + rand()%(hval - 1); 将在0arraySize + hval - 2 之间的范围内生成t。后面的值远远超出了访问tmp[t] 的有效范围,很可能是分段错误的原因。

    你可能是这个意思:t = (i + rand()) % (hval - 1);

  2. 下面的构造是一个数据竞赛。您根本没有保证不同线程有不同的ns。

  int n = threadnum++;

解决问题 2 的通常方法是将线程号作为 arg(您没有使用)传递。

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 2012-05-10
    • 2015-09-10
    • 1970-01-01
    • 2015-09-11
    • 2020-02-29
    • 1970-01-01
    • 2018-08-27
    • 2023-04-02
    相关资源
    最近更新 更多