valgrind에서 아래 코드를 컴파일하고 실행하면 스레드에 가입 할 때 스레드가 free'd가 된 것처럼 보입니다. 그런 다음 나중에 메모리가 참조되지 않게됩니다. 이미 free'd는 읽힌다.Vala : 조인 된 스레드가 참조 해제 될 때 유효하지 않은 읽기가 발생했습니다.
valgrind에서 "거짓 긍정"입니까? 그렇지 않다면 더 큰 병렬 프로그램에서 무시하는 것이 일반적으로 안전한가요? 어떻게해야합니까?
int main (string[] args) {
Thread<int> thread = new Thread<int>.try ("ThreadName",() => {
stdout.printf ("Hello World");
return 0;
});
thread.join();
return 0;
}
==2697== Invalid read of size 4
==2697== at 0x50F2350: g_thread_unref (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3800.1)
==2697== by 0x400A65: _vala_main (in /home/lockner/test)
==2697== by 0x400A9C: main (in /home/lockner/test)
==2697== Address 0x5dc17e8 is 24 bytes inside a block of size 72 free'd
==2697== at 0x4C2B60C: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2697== by 0x50F2547: g_thread_join (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3800.1)
==2697== by 0x400A4B: _vala_main (in /home/lockner/test)
==2697== by 0x400A9C: main (in /home/lockner/test)
"thread = NULL;"수동으로 추가하면 생성 된 C 코드의 조인 호출과 _g_thread_unref0 매크로 사이에서 잘못된 읽기가 valgrind 출력으로 사라집니다.
g_thread_join (thread);
result = 0;
thread = NULL;
_g_thread_unref0 (thread);
return result;
답변을 수락 된 것으로 설정해야합니다. –