2017-02-25 11 views
0

以下のコードでは、valgrindでチェックした限り、親と子のメモリリークはありません。マルチスレッドプロセスのフォーク、スレッドのメモリの割り当て

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

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

ここでは2つの質問があります。 最初にスレッドを作成するために割り当てられたメモリを処理しませんでしたか?私は子プロセスに参加しませんでした。メモリリークはないはずですか?

#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; 
} 

2番目の質問は、スレッドが子に存在しないことです。しかし、以下のようなコードを変更すると、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; 
} 

答えて

0

fork()が(同じコードを実行/プロセスの実際には別のライン)全体のプロセスは、「重複」されるようにする

だから、親プロセスで何かが子プロセスにも

です

したがって、親と子の両方がスレッドを実行しています。 fork()への呼び出しは、スレッドを実行した後でもpthread_join()

への呼び出しを持っている必要がありますので

だから、親と子の両方は、pthread_join()

エラーパスへの呼び出しを持っている必要があります注意:fork()を呼び出すときに、親プロセスはまた、以上を呼び出す必要があります:pthread_create()を呼び出すときに、常に操作が成功

注意した保証するために、戻り値をチェックする必要があります子プロセスがゾンビプロセスにならないようにしてください。現代のOSは、実際の親プロセスが子プロセスの前に終了した場合に子プロセスをinit()に接続します。

+1

これによると http://pubs.opengroup.org/onlinepubs /000095399/functions/fork.html "プロセスは1つのスレッドで作成されます。マルチスレッドプロセスがfork()を呼び出す場合、新しいプロセスには呼び出し側スレッドのレプリカとそのアドレス空間全体が含まれます。 –

+0

したがって、呼び出し側のスレッドだけが複製されます。 –

+0

しかし、両方のプロセスで待機スレッドと結合スレッドを追加すると、それは 総ヒープ使用量を示しています:2つのallocs、2つの解放、1,296バイトは、子と親の両方のために を割り当てましたが、私は子供のスレッドに参加しない場合は、 総ヒープ使用量:1 allocs、1 frees、272 bytes allocated 子供のため –