pthread_join seg fault core dump

时间:2015-08-10 01:41:39

标签: c pthreads

我在pthread_join行遇到了一个seg错误错误。下面是我的线程创建和连接代码以及我正在调用的my_func线程函数。该程序应该创建一个可变数量的线程来执行类似grep的函数。

int                             
parallelSearchStatic(char **argv)
{
    pthread_t worker_thread[NUM_THREADS];
    ARGS_FOR_THREAD *args_for_thread;
    queue_element_t *element;
    int i;
    int num_occurrences = 0;
    int queue_count = 0;

    queue_t *queue = createQueue();             /* Create and initialize the queue data structure. */

    DIR           *d;
    struct dirent *dir;
    d = opendir(argv[2]);
    if (d)
    {
        while ((dir = readdir(d)) != NULL)
        {
            element = (queue_element_t *)malloc(sizeof(queue_element_t));
            if(element == NULL){
                     perror("malloc");
                     exit(EXIT_FAILURE);
            }

            strcpy(element->path_name, argv[2]);
            strcat(element->path_name, "/");
            strcat(element->path_name, dir->d_name);

            insertElement(queue, element);
            queue_count++;
        }

        closedir(d);
    }

    int increment = queue_count/NUM_THREADS;

    for(i=0;i<NUM_THREADS;i++){

        args_for_thread = (ARGS_FOR_THREAD *)malloc(sizeof(ARGS_FOR_THREAD));
        args_for_thread->threadID=i;
        args_for_thread->queue=createQueue();
        args_for_thread->args=argv;

        for(i = 0; i < increment; i++)
        {
            insertElement(args_for_thread->queue, removeElement(queue));
            queue_count--;
        }

        if(i == (NUM_THREADS - 1) && queue_count != 0)
        {
            for(i = 0; i < queue_count; i++)
            {
                insertElement(args_for_thread->queue, removeElement(queue));
            }
        }

        if((pthread_create(&worker_thread[i], NULL, my_func, (void *)args_for_thread))!=0){
            printf("Cannot create thread \n");
            exit(0);
        }

    }

    for(i=0;i<NUM_THREADS;i++)
    {
        pthread_join(worker_thread[i], NULL);
    }

    for(i = 0; i < NUM_THREADS; i++)
        num_occurrences += countArray[i];

    return num_occurrences;
}

void *my_func(void *this_arg)
{
    ARGS_FOR_THREAD *args_for_me = (ARGS_FOR_THREAD *)this_arg; // Typecast the argument passed to this function to the appropriate type

    int threadID = args_for_me->threadID;
    queue_t *queue = args_for_me->queue;
    char** args = args_for_me->args;

    int count = 0;

    while(queue->head != NULL)
    {       
        queue_element_t *element = removeElement(queue);

        char *a[5];

        a[0] = args[0];
        a[1] = args[1];
        a[2] = element->path_name;
        a[3] = args[3];
        a[4] = args[4];

        count += serialSearch(a);
    }

    countArray[threadID] = count;

    free((void *)args_for_me); // Free up the structure
    pthread_exit(NULL);
}

1 个答案:

答案 0 :(得分:1)

您正在外循环中的嵌套循环中重用i,该外循环也使用for(i = 0; i < increment; i++) 作为其计数器变量:

for(i = 0; i < queue_count; i++)

pthread_create()

这意味着您的i(在这些内部循环之后)使用了错误的worker_thread[i]值来访问worker_thread[],因此pthread_join()的某些值仍然未初始化,然后导致j崩溃。

为内循环使用不同的变量(例如s += b--*!c )。