c - 处理大数组时出现段错误

标签 c segmentation-fault pthreads

我一直在尝试在一个程序中使用 Pthreads 来计算 3000000 元素 int 数组中的 3,当它在不使用 pthreads 的情况下按顺序运行时,它工作得很好。

使用 pthreads 会导致段错误,我不明白为什么。在 8GB RAM 和 256K L2 缓存上有 4 个线程的情况下,当每个线程达到大约 300000 次迭代时,执行停止。

这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <pthread.h>
#define LENGTH 3000000
#define NUM_THREADS 4

int countarr[128];
int* array;

struct Op_data{
int start_index;
int count_index;
int CHUNK;
int ID;   
};
void* count3s(void* data) // you need to parallelize this
{
    struct Op_data *info;
        info = (struct Op_data *) data;
    int count_i = info -> count_index;
    int i = info->start_index;
    int CHUNK = info -> CHUNK;
    printf("Thread data:\nCOUNT_INDEX:\t\t%d\nSTART_INDEX:\t\t%d\nCHUNK_SIZE:\t\t%d\n",count_i,i,CHUNK);
    int c = 0;

    struct timeval t1, t2;
    gettimeofday(&t1, NULL);
    for(i;i<i+CHUNK;i++)
    {
        if(array[i]==3)
        {
            c++;
        }
    }
    countarr[count_i] = c;
    gettimeofday(&t2, NULL);
    double t = (t2.tv_sec - t1.tv_sec) + (t2.tv_usec - t1.tv_usec ) / 1000000.0; 
    printf("execution time = %f seconds\n",t);
}
int main(int argc, char * argv[])
{

    int i = 0;
    int ok = 0;
    int count=0;
    array = malloc(LENGTH * sizeof(int));   

        // initialize the array randomly. Make sure the number of 3's doesn't exceed 500000 
    srand(12);

    for(i= 0;i<LENGTH;i++)
        {
        array[i]=rand()%10;

        if(array[i]==3)
                {
            ok++; // keep track of how many 3's are there, we will use this later to confirm the correctness of the code
            if(ok>500000)
                        {
                ok=500000;
                array[i]=12;
            }
        }
    }  
    pthread_t threads[NUM_THREADS];
        struct Op_data* t_data[NUM_THREADS];

        pthread_attr_t attr;
        pthread_attr_init(&attr);

        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
    int rc;
    int CHUNK = LENGTH/NUM_THREADS;
    for(int t=0;t<NUM_THREADS;t++)
    {
        t_data[t] = (struct Op_data*) malloc(sizeof(struct Op_data));
        t_data[t] -> start_index = t*CHUNK;
        t_data[t] -> count_index = t*(128/NUM_THREADS);
        t_data[t] -> CHUNK = CHUNK;
        t_data[t] -> ID = t;
        rc = pthread_create(&threads[t], &attr, count3s, (void *)t_data[t]);
        if (rc) {
            printf("Error:unable to create thread,%d\n",rc);
            exit(-1);
            }
    printf("Thread (%d) has been created.\n",t);
    }


    for( int g = 0; g < NUM_THREADS; g++ ) {
        rc = pthread_join(threads[g], NULL);
        if (rc) {
            printf("Error:unable to join,%d\n",rc);
            exit(-1);
        }

    }
    pthread_attr_destroy(&attr);      

        for(int x=0;x<NUM_THREADS;x++)
    {
        count += countarr[x*(128/NUM_THREADS)];
    }

    if( ok == count ) // check if the result is correct
        {
        printf("Correct Result!\n");    
        printf("Number of 3`s: %d\n_________________________________\n",count);
    }
    else
        {
        printf("Wrong Result! Your count:%d\n",count);  
        printf("The correct number of 3`s is: %d\n",ok);
    }
pthread_exit(NULL);
    return 0;
}

最佳答案

for(i;i<i+CHUNK;i++)

因为 i 总是小于 i + CHUNK(除非它溢出),这个循环将超出数组的边界。

关于c - 处理大数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53710220/

相关文章:

c - 如何在 posix_openpt() 中定义名称

c++ - 控制台中的 OutputDebugString()

c - 如何正确使用 EOF?

c - 如何用assert实现C宏

c - 读取位置 0x003134d4 访问冲突

遍历列表时出现 C 段错误

c - fread 段错误仅在少数情况下出现

c++ - 多平台多处理?

c++ - Linux 多线程应用程序中的中断生成 SIGSEGV

c - pthread_atfork 锁定习语坏了?