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;
}
                    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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With