簡體   English   中英

C 分段故障線程

[英]C segmentation fault threads

這是一個在 C 中制作的程序,使用 gcc 文件名可以很好地編譯。c -o 文件 -pthread。 但是,當我 go 運行程序時告訴我存在分段錯誤,我不知道如何修復它。 該程序旨在在數組中生成隨機整數,然后比較使用不同數量的線程來查找程序的到達迭代所需的 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;
}

您的程序中幾乎沒有明顯的錯誤。

  1. 正如矢野所指出的, t = i + rand()%(hval - 1); 將產生一個介於0arraySize + hval - 2之間的t 后面的值遠遠超出了訪問tmp[t]的有效范圍,很可能是分段錯誤的原因。

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

  2. 下面的構造是一個數據競賽。 您根本保證不同線程的不同n

  int n = threadnum++;

問題 2 的通常解決方法是將線程號作為arg傳遞(您沒有使用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM