pthread_join 后出现分段错误(核心已转储)
Segmentation fault (core dumped) after pthread_join
我正在尝试使用多线程程序,但 pthread_join 函数出现错误。此代码的输出是:
after pthread_create
Segmentation fault (core dumped)
这是代码:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void *myfunc1()
{
// code segments
pthread_exit(sum1);
}
void *myfunc2()
{
// code segments
pthread_exit(sum2);
}
int main(int argc, char *argv[])
{
void *sum1, *sum2;
pthread_t thread_id1,thread_id2;
pthread_create(&thread_id1,NULL,myfunc1,NULL);
pthread_create(&thread_id2,NULL,myfunc2,NULL);
printf("after pthread_create\n");
pthread_join(thread_id1, &sum2);
pthread_join(thread_id2, &sum1);
printf("after pthread_join\n");
float firstSum = *((float *)sum1);
float secondSum = *((float *)sum2);
printf("Sum is %.5f\n\n", firstSum+secondSum);
return 0;
}
您的分段错误发生在您的一个线程中。 pthread_create() 创建并启动您的线程,pthread_join() 让您的主线程等待其他线程结束。您的主线程保持 运行 并开始等待您的其他线程结束,但其中一个线程会产生分段错误,因此您的主线程不会显示 "after pthread_join"。所以分段错误不是来自 pthread_join().
sum1
和 sum2
未初始化。所以这些行
float firstSum = *((float *)sum1);
float secondSum = *((float *)sum2);
解引用未定义的指针。
你的线程函数应该传回一个指针(指向在函数退出后仍然存在的东西)然后可以被pthread_join使用,例如
void *myfunc1()
{
float *ret = malloc(sizof *ret);
*ret = 3.14;
// code segments
pthread_exit(ret);
}
然后在主
float *sum1;
// run the thread
pthread_join(thread_id2, (void**)&sum1);
float result = *sum1;
free(sum1);
我正在尝试使用多线程程序,但 pthread_join 函数出现错误。此代码的输出是:
after pthread_create
Segmentation fault (core dumped)
这是代码:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void *myfunc1()
{
// code segments
pthread_exit(sum1);
}
void *myfunc2()
{
// code segments
pthread_exit(sum2);
}
int main(int argc, char *argv[])
{
void *sum1, *sum2;
pthread_t thread_id1,thread_id2;
pthread_create(&thread_id1,NULL,myfunc1,NULL);
pthread_create(&thread_id2,NULL,myfunc2,NULL);
printf("after pthread_create\n");
pthread_join(thread_id1, &sum2);
pthread_join(thread_id2, &sum1);
printf("after pthread_join\n");
float firstSum = *((float *)sum1);
float secondSum = *((float *)sum2);
printf("Sum is %.5f\n\n", firstSum+secondSum);
return 0;
}
您的分段错误发生在您的一个线程中。 pthread_create() 创建并启动您的线程,pthread_join() 让您的主线程等待其他线程结束。您的主线程保持 运行 并开始等待您的其他线程结束,但其中一个线程会产生分段错误,因此您的主线程不会显示 "after pthread_join"。所以分段错误不是来自 pthread_join().
sum1
和 sum2
未初始化。所以这些行
float firstSum = *((float *)sum1);
float secondSum = *((float *)sum2);
解引用未定义的指针。
你的线程函数应该传回一个指针(指向在函数退出后仍然存在的东西)然后可以被pthread_join使用,例如
void *myfunc1()
{
float *ret = malloc(sizof *ret);
*ret = 3.14;
// code segments
pthread_exit(ret);
}
然后在主
float *sum1;
// run the thread
pthread_join(thread_id2, (void**)&sum1);
float result = *sum1;
free(sum1);