pthread (segmentation fault)
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.
IKS
Updated on June 04, 2022Comments
-
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; }