下面的代码在第二种情况下给出了seg错误,但在第一部分中它工作正常。 但他们都在做同样的事情.在这里,pthread_join(( 调用不会生成任何错误,但是在打印来自 pthread_join(( 的响应时,它会生成分段错误。第一个在做什么与第二个不同?第二个实际上错在哪里?
法典
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void * thread_ops(void *arg){
printf("Thread Start!n");
int val=((int *)arg)[0];
printf("value at thread -> %dn",val);
int * c=(int *)malloc(sizeof(int *));
*c=val;
pthread_exit((void*)c);
}
int main(){
pthread_t pt,pt2;
pthread_attr_t ptatr;
int ar[1]={1};
// working
pthread_attr_init(&ptatr);
int status;
status=pthread_create(&pt,&ptatr,&thread_ops,ar);
printf("Thread Stats : %dn",status);
int *result;
pthread_join(pt,(void **)&result);
printf("Result is %dn",*result);
// why does the next set of lines generate seg fault ??
void **result2;
status=pthread_create(&pt,&ptatr,&thread_ops,ar);
pthread_join(pt,result2);
int ** res2=(int **)result2;
printf("Result is %dn",**res2);
return 0;
}
输出
Thread Stats : 0
Thread Start!
value at thread -> 1
Result is 1
Thread Start!
value at thread -> 1
Segmentation fault (core dumped)
而不是
void **result2;
pthread_join(pt,result2);
用
void *pvresult;
pthread_join(pt, &pvresult);
正如您所期望的那样,int
添加以下内容:
int result = *((int*) pvresult);
并以此方式打印:
printf("Result is %dn", result);
也替换这个
int * c=(int *)malloc(sizeof(int *));
通过这个
int *c = malloc(sizeof *c);