lcdマルチスレッドはbmpピクチャにメモリの問題が発生して中断することを表示します
17448 ワード
詳細はクリックしてください:私のディレクトリ本編は自分の学んだ知識と応用を記録するために使用され、コードは依然として最適化することができ、参考にするために使用されます.もし間違いが発見されたら、私にメッセージを残してください.ありがとうございます.
この記録lcdディスプレイにブラインド効果を加えてbmpピクチャを表示すると、あるbmpピクチャでメモリオーバーフローの問題が発生し始めます.エラーは次のとおりです.
原因:マルチスレッドが実行されると、親プロセスがサブプロセスより先に終了し、サブプロセスが回収されず、プログラムの実行が中断します.
コードは次のとおりです.
解決策:親プロセスの子プロセスの終了を待つセクションに追加
コードは次のとおりです.
この記録lcdディスプレイにブラインド効果を加えてbmpピクチャを表示すると、あるbmpピクチャでメモリオーバーフローの問題が発生し始めます.エラーは次のとおりです.
[ 199.690000] lowmemorykiller: Killing 'show' (487), adj 0,
[ 199.690000] to free 4180kB on behalf of 'show' (705) because
[ 199.690000] cache 232kB is below limit 6144kB for oom_score_adj 0
[ 199.690000] Free memory is 3176kB above reserved
原因:マルチスレッドが実行されると、親プロセスがサブプロセスより先に終了し、サブプロセスが回収されず、プログラムの実行が中断します.
コードは次のとおりです.
pid_t id1;
id1 = fork();
if(id1 > 0)
{
for(int i=0; i<h/2/n; i++) // h / n
{
for(int j=w*n*i,k=0; j<(w*n*i+w);j+=n,k++) //
{
// (480-h/n)/2)、(800-w/n)/2)、 n
*(mmap_bmp+800*(((480-h/n)/2)+i)+((800-w/n)/2)+k) = tempbuf[j];
}
sleep(0.1);
}
}
else if(id1 == 0)
{
for(int i=h/2/n-2; i<h/n; i++) // h / n
{
for(int j=w*n*i,k=0; j<(w*n*i+w);j+=n,k++) //
{
// (480-h/n)/2)、(800-w/n)/2)、 n
*(mmap_bmp+800*(((480-h/n)/2)+i)+((800-w/n)/2)+k) = tempbuf[j];
}
sleep(0.1);
}
}
解決策:親プロセスの子プロセスの終了を待つセクションに追加
コードは次のとおりです.
pid_t id1;
int status;
id1 = fork();
if(id1 > 0)
{
for(int i=0; i<h/2/n; i++) // h / n
{
for(int j=w*n*i,k=0; j<(w*n*i+w);j+=n,k++) //
{
// (480-h/n)/2)、(800-w/n)/2)、 n
*(mmap_bmp+800*(((480-h/n)/2)+i)+((800-w/n)/2)+k) = tempbuf[j];
}
sleep(0.1);
}
sleep(1);
}
else if(id1 == 0)
{
for(int i=h/2/n-2; i<h/n; i++) // h / n
{
for(int j=w*n*i,k=0; j<(w*n*i+w);j+=n,k++) //
{
// (480-h/n)/2)、(800-w/n)/2)、 n
*(mmap_bmp+800*(((480-h/n)/2)+i)+((800-w/n)/2)+k) = tempbuf[j];
}
sleep(0.1);
}
exit(1);
}
pid_t otherid=waitpid(id1,&status,0); //