pthread (segmentation fault)

19,828
    pthread_t p_thread[2];
    struct arg_struct arg[2];
    int temp[2];

You only allocated space for two elements here, so if you launch more than 2 threads you'll run off the end of the array and potentially crash or corrupt the stack.

Additionally:

            pthread_join(p_thread[i], (void**)&status);

status is an int, not a void *; attempting this will try to store a void * in an int. On many 64-bit platforms, this will also overflow (since void * will be 8 bytes while int is 4). Make status a void *, and stop trying to cast away compiler errors like this. They're errors for a reason.

Share:
19,828
IKS
Author by

IKS

Updated on June 04, 2022

Comments

  • IKS
    IKS almost 2 years

    I'm Korean and I'm not good at English but if you give me a comment down there
    I will be very pleased and will try to understand it.

    I created, for example, 10 threads and tried to join them after creation and return the value.
    But when I join the last thread, I get a segmentation fault.

    The result comes out like this..

    Before Thread 1 create
    After Thread 1 create
    Before Thread 0 create
    After Thread 0 create
    Before Thread 1 join
    After Thread 1 join
    Before Thread 0 join
    Segmentation Fault(core dumped)
    

    when I create 4 threads it's like

    Before Thread 3 create
    After Thread 3 create
    Before Thread 2 create
    After Thread 2 create
    Before Thread 1 create
    After Thread 1 create
    Before Thread 0 create
    After Thread 0 create
    Before Thread 3 join
    After Thread 3 join
    Before Thread 2 join
    After Thread 2 join
    Before Thread 1 join
    After Thread 1 join
    Before Thread 0 join
    Segmentation Fault(core dumped)
    

    I can't seem to find why.

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <unistd.h>
    
    pthread_mutex_t mutex_lock;
    
    struct arg_struct {
            int a;
            int b;
    };
    
    void *t_function(void *data) {
            pthread_mutex_lock(&mutex_lock);
    
            struct arg_struct *arg = (struct arg_struct *)data;
            long int s;
    
            s = arg->a;
    
            pthread_mutex_unlock(&mutex_lock);
    
            return (void **)s;
    }
    
    int main()
    {
            int i;
    
            pthread_t p_thread[2];
            int thr_id;
            int status;
    
            struct arg_struct arg[2];
    
            for(i = 1; i >= 0; i--) {
                    arg[i].a = i;
                    arg[i].b = i;
            }
    
            pthread_mutex_init(&mutex_lock, NULL);
    
            for(i = 1; i >= 0; i--) {
                    printf("Before Thread %d create\n", i);
                    thr_id = pthread_create(&p_thread[i],NULL, t_function, (void *)&arg[i]);
                    printf("After Thread %d create\n", i);
                    usleep(1000);
            }
    
            int temp[2];
    
            for(i = 1; i >= 0; i--) {
                    printf("Before Thread %d join\n", i);
                    pthread_join(p_thread[i], (void**)&status);
                    printf("After Thread %d join\n", i);
                    temp[i] = status;
            }i
    
            printf("%d%d", temp[1], temp[0]);
    
            pthread_mutex_destroy(&mutex_lock);
    
            return 0;
    }