Работая с pthreads, я столкнулся с запутанной проблемой.
Если я определю int-указатель после pthread_join, это может привести к сбою программы.В любом месте до pthread_join все работает нормально.Я хотел бы знать, почему это происходит.
works.c
#include <stdio.h>
#include <assert.h>
#include <pthread.h>
#include <stdlib.h>
void *somefunction(void *vargp);
int main(int argc, char **argv){
if (argc < 2){
fprintf(stderr, "Invalid usage, bleh\n");
return 1;
}
int argu = atoi(argv[1]);
pthread_t tid;
int rc = pthread_create(&tid, NULL, somefunction, &argu);
assert (rc == 0);
void **retval;
int foo = 10;
int *foo_ptr = &foo;
pthread_join(tid, retval);
printf("retval is %d\n", **(int **)retval);
printf("*foo_ptr is %d\n", *foo_ptr );
pthread_exit(NULL);
}
void *somefunction(void *vargp){
int *someint = (int *) vargp ;
*someint = *someint * 3;
printf("In somefunction, someint value is %d\n", *someint);
pthread_exit(someint);
}
fails.c
, если int * foo_ptr находится после pthread_join (), это вызывает у меня сбой:
#include <stdio.h>
#include <assert.h>
#include <pthread.h>
#include <stdlib.h>
void *somefunction(void *vargp);
int main(int argc, char **argv){
if (argc < 2){
fprintf(stderr, "Invalid usage, bleh\n");
return 1;
}
int argu = atoi(argv[1]);
pthread_t tid;
int rc = pthread_create(&tid, NULL, somefunction, &argu);
assert (rc == 0);
void **retval;
pthread_join(tid, retval);
int foo = 10;
int *foo_ptr = &foo; // <-------- this line causes a crash
printf("retval is %d\n", **(int **)retval);
printf("*foo_ptr is %d\n", *foo_ptr );
pthread_exit(NULL);
}
void *somefunction(void *vargp){
int *someint = (int *) vargp ;
*someint = *someint * 3;
printf("In somefunction, someint value is %d\n", *someint);
pthread_exit(someint);
}
Спасибо!