2013-12-11 2 views
4

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; 

답변

4

는 그것이

는 [DestroysInstance] 상기 (가) 문제를 해결 가입 추가의 glib-2.0.vapi에서 누락 주석이었다 나온다.

+0

답변을 수락 된 것으로 설정해야합니다. –

1

g_thread_join은 이미 1 개의 참조를 제거합니다. 따라서 생성 된 코드는 두 번 사용 가능합니다.

[DestroysInstance]을 추가해야하는 경우 valac/GThread 바인딩에 분명히 버그가 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 Vala의 자식에게 전념 한 패치를 보냈습니다. 그래서이 문제는 이후 버전에서 사라질 것입니다. – lockner

+0

@lockner +1 고정 용 – drahnr

관련 문제