以下のコードでは、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;
}
これによると http://pubs.opengroup.org/onlinepubs /000095399/functions/fork.html "プロセスは1つのスレッドで作成されます。マルチスレッドプロセスがfork()を呼び出す場合、新しいプロセスには呼び出し側スレッドのレプリカとそのアドレス空間全体が含まれます。 –
したがって、呼び出し側のスレッドだけが複製されます。 –
しかし、両方のプロセスで待機スレッドと結合スレッドを追加すると、それは 総ヒープ使用量を示しています:2つのallocs、2つの解放、1,296バイトは、子と親の両方のために を割り当てましたが、私は子供のスレッドに参加しない場合は、 総ヒープ使用量:1 allocs、1 frees、272 bytes allocated 子供のため –