-1

I am getting a seg fault error at my pthread_join line. Below is my thread creation and joining code as well as my my_func thread function that I am calling. The program is supposed to create a variable amount of threads to execute a grep like function.

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);
}
caf
  • 233,326
  • 40
  • 323
  • 462
tallaghi
  • 325
  • 2
  • 3
  • 7
  • Don't cast the return value of `malloc` and friends: https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc . And what would even be better, don't use casts at all. In C, all object pointers convert seamlessly to `void*` and back. – Jens Gustedt Aug 10 '15 at 06:59

1 Answers1

1

You are using re-using i in nested loops within an outer loop that also uses i as its counter variable:

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

and

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

This means that your pthread_create() (which follows these inner loops) is using the wrong value of i to access worker_thread[i], so some values of worker_thread[] remain uninitialised and then cause pthread_join() to crash.

Use a different variable (eg. j) for the inner loops.

caf
  • 233,326
  • 40
  • 323
  • 462