fork在多线程进程中,为线程分配内存

时间:2017-02-25 18:12:04

标签: c memory-leaks pthreads fork pthread-join

在下面的代码中,就我用valgrind检查,父和子中没有内存泄漏。

Child   total heap usage: 1 allocs, 1 frees, 272 bytes allocated

Parent  total heap usage: 2 allocs, 2 frees, 1,296 bytes allocated

我在这里有两个问题。 首先,没有为创建线程处理分配的内存?我没有加入儿童流程。不应该有内存泄漏吗?

#include <unistd.h>
#include <stdio.h>
#include <pthread.h>

void* foo(void* arg){


    puts("hello, world!");
    sleep(3);

    return NULL;
}

int main(){

    pthread_t thread;

    pthread_create(&thread, NULL, foo, NULL);

    switch(fork()){

        case -1:
            fprintf(stderr, "error\n");
            break;
        case 0:
            fprintf(stderr, "%d child finished\n", getpid());
            break;
        default:
            pthread_join(thread, NULL); 
            fprintf(stderr, "%d parent finished\n", getpid());
    }   

    return 0;
}

第二个问题是,儿童中并不存在线索。但是当我改变代码时,pthread_join返回0(成功)。不应该在子进程中返回错误并设置errno吗?

int main(){

    pthread_t thread;

    pthread_create(&thread, NULL, foo, NULL);

    switch(fork()){

        case -1:
            fprintf(stderr, "error\n");
            break;
        case 0:
            fprintf(stderr, "%d child finished\n", getpid());
            break;
        default:
            fprintf(stderr, "%d parent finished\n", getpid());
    }   

    printf("%d\n", pthread_join(thread, NULL));

    puts(strerror(errno));

    return 0;
}

1 个答案:

答案 0 :(得分:0)

fork()导致整个过程被重复&#39; (实际上只是通过相同代码的另一行执行/处理)

所以父进程中的任何内容也都在子进程中

因此父和子都有线程运行。

因此,父母和孩子都需要拨打pthread_join()

调用fork()之后的错误路径也有线程正在运行,所以它也应该调用pthread_join()

注意:调用pthread_create()时,应始终检查返回的值以确保操作成功

注意:在调用fork()时,父进程也应该调用wait()或更好,waitpid()因此子进程不会成为僵尸进程(现代操作系统会附加子进程)如果实际的父级在子级之前退出,则转到init()进程。)