如何知道是什么导致pthread_create()中的SEGFAULT

时间:2019-07-18 20:38:08

标签: c multithreading pthreads

我使用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);

感谢任何可能的建议!

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,就可以了。