我已完成以下代码。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
struct foo
{
int a;
int b;
};
void* thread_func1(void *arg)
{
struct foo *temp = (struct foo*)malloc(sizeof(struct foo));
temp->a = 10;
temp->b = 20;
pthread_exit(temp);
}
void* thread_func2(void *arg)
{
pthread_exit((void*)100);
}
int main()
{
pthread_t tid1, tid2;
int err;
struct foo *f;
void *ret;
err = pthread_create(&tid1, NULL, thread_func1, NULL);
err = err | pthread_create(&tid2, NULL, thread_func2, NULL);
if(err != 0)
{
perror("pthread_create()");
exit(-1);
}
err = pthread_join(tid1, (void**)&f);
if(err != 0 )
{
perror("pthread_join1");
exit(-1);
}
printf("a = %d, b = %d\n", f->a, f->b); //Line1
err = pthread_join(tid2, &ret);
if(err != 0 )
{
perror("pthread_join2");
exit(-1);
}
printf("ret = %d\n", *(int*)ret); //Line2
return 0;
}
我在Line2上遇到分段错误。 Line2有什么问题
如果我将Line2修改为
printf(“ret =%d \ n”,(int)ret);
没有分段错误,它打印正确的值(即100)。我不明白为什么修改工作。我相信我对双指针的使用有错误的概念。我想纠正它。
分段错误的原因是什么?修改的原因是什么?
答案 0 :(得分:3)
那是因为你返回的是实际的整数,而不是指针,但你可以将它作为指针访问。
答案 1 :(得分:2)
您从线程中返回一个数字。在第一个帖子中,该数字是struct foo *
。因此,如果你说
pthread_join(tid1, &ret);
然后ret
将包含该指针(不一个双指针)。
同样在第二种情况下,即使您将其视为100
,也会返回void *
。尽管如此,该值仍为100
!
因此,当你写
pthread_join(tid2, &ret);
ret
将包含100
,它不是指针,而只是整数。这就是你应该把它投射到int
。
您遇到分段错误的原因是您将100
视为int *
,然后尝试取消引用它。
答案 2 :(得分:1)
因为你试图取消引用地址为100的指针。
为什么不传递指向你想要在thread_funcs中分配的内容的指针,而不是查看返回值?也就是说,使用thread_func1()和thread_func2()
的“void * arg”参数像这样:
void* thread_func1(void *arg)
{
struct foo **fooPtrPtr = (struct foo**) arg;
*fooPtrPtr = (struct foo*)malloc(sizeof(struct foo));
...
}
void* thread_func2(void *arg)
{
int *intPtr = arg;
*intPtr = 100;
...
}
int main()
{
pthread_t tid1, tid2;
int err;
struct foo *f;
int ret;
err = pthread_create(&tid1, NULL, thread_func1, &f);
err = err | pthread_create(&tid2, NULL, thread_func2, &ret);
...
printf("a = %d, b = %d\n", f->a, f->b); //Line1
...
printf("ret = %d\n", ret); //Line2
...
}
答案 3 :(得分:1)
pthread_exit((void*)100);
导致整数100
成为线程的退出状态。它只是滥用类型转换,因此void*
是它的类型。
如果要检索此值,则必须在主线程中使用相同的类型转换滥用:
int ret;
err = pthread_join(tid2, (void**) &ret);
// here you can work with ret as with any other integer
我还建议您使用return
代替pthread_exit
。另请注意,应使用malloc
释放使用free
动态分配的内存。返回值malloc
的类型转换在这里是多余的,可以省略。
这个问题也可以帮助您:Close a thread when done with it