2011-09-09 10 views
2

スレッドセーフでない操作を使用するアルゴリズムの並列実装でプログラミングします。したがって、fork()とPOSIX-Shared Memoryを使用しています。これはうまく動作します。今質問。子供が出たときに、親のダイナミックに割り振られた記憶はどうなりますか? コードは、このフォークとメモリの割り当て

int compute(....) { 
// prepare shared memory 
pid_t child = fork(); 
if (child == 0) { 
    // process the child code 
    int *workspace = malloc(worksize*sizeof(int)); 
    // copy the result to Shared memory 

    free(workspace); 
    exit(0); 
} 
// do parents work 
wait(&status); 
// retrieve results from shared memory 
return 0; 
} 

のように見える問題は、私は計算が呼び出され、どのメモリが彼らのどこに割り当てられているから分からないということです。私が授与できることを願っている唯一のことは、親によって割り当てられたメモリが子供の中でのみ読み込まれて使用されることです。子供によって割り当てられたダイナミックに割り当てられたメモリは、子供によって解放される。 これはメモリリークを引き起こすかどうか? Valgrindははいと言っています。私はこれを避ける考えを持っていません。すべてのメモリ割り当てをトラッキングすることは残念ながら不可能です。

+0

forkの前に割り当てる場合は、親と子の両方で解放する必要があります。 –

+0

しかし、forkの後に割り振った場合、割り振ったプロセスを解放する必要があります。 –

答えて

0

コードが図のとおり正確に見える場合、メモリリークは発生しません。あなたが言うように、子供は退室前にすべての記憶を解放します。 valgrindはいくつかの問題を抱えているかもしれません。fork ed processes。

+0

子プロセスは、親プロセスによって以前に割り当てられたメモリではなく、自己によって割り当てられたメモリのみを解放します。 –