我使用gdb发现segfault发生在pthread_create()中。但是我不知道是什么引起了这个问题。
代码如下。 SEGFAULT是否真的发生在foo()中而不是pthread_create()中?
void *foo(void *arg)
{
long thread_id = (long) arg;
/*
...
*/
}
然后在主要功能中
pthread_t *threads = NULL;
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_JOINABLE);
threads = (pthread_t *) calloc (num_threads, sizeof(pthread_t));
check (threads != NULL, "Failed to allocate threads.");
pthread_create (&threads[0], &attr, foo, (void *)0);
pthread_create (&threads[1], &attr, foo, (void *)1);
感谢任何可能的建议!
答案 0 :(得分:0)
第一:How to create a Minimal, Reproducible Example 试试这个。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *foo(void *arg)
{
long thread_id = (long) arg;
/*
...
*/
printf("%i\n",thread_id);
return NULL;
}
int main(){
const int num_threads = 10;
pthread_t *threads = NULL;
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_JOINABLE);
threads = (pthread_t *) malloc (num_threads* sizeof(pthread_t));
if(threads == NULL){
return -1;
}
for(int i = 0; i < num_threads; ++i){
pthread_create (&threads[i], &attr, foo, (void *)i);
}
for(int i = 0; i < num_threads; ++i){
pthread_join(threads[i], NULL);
}
free(threads);
}
我将其更改为malloc而不是calloc,并调用join以等待每个线程完成后再继续。然后释放所有创建的线程。它对我来说并不崩溃。
当我运行您的原始代码时。我没有收到细分错误。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *foo(void *arg)
{
long thread_id = (long) arg;
/*
...
*/
printf("%i\n",thread_id);
return NULL;
}
int main(){
const int num_threads = 10;
pthread_t *threads = NULL;
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_JOINABLE);
threads = (pthread_t *) calloc (num_threads, sizeof(pthread_t));
if(threads == NULL){
return -1;
}
pthread_create (&threads[0], &attr, foo, (void *)0);
pthread_create (&threads[1], &attr, foo, (void *)1);
}
如果我不得不猜测,那就是主函数在线程有机会完成执行之前就终止了,这可能导致崩溃。同样在您的示例中,您并没有释放所发布代码中的内存。因此,如果您确实在线程有机会完成执行之前释放了内存,那也可能导致崩溃。我认为,如果在创建后添加pthread_join,就可以了。