2010-07-13 3 views
3

크로스 플랫폼 프로젝트에서 스레드 로컬 저장소를 사용해야합니다. * IX에서 pthreads를 사용하고 있는데, 좋은 소멸자 함수 포인터가 두 번째 인수 인 pthread_key_create으로 전달 되었기 때문에 메모리 누수가 발생하지 않을 수 있지만, Windows에서는 TlsAlloc에는 그런 것이 없습니다. 또한 어떤 함수가 스레드 종료시 호출되는 일반적인 위치를 찾을 수 없습니까 (그렇지 않으면 종료시 호출되는 함수 포인터의 목록을 homebrew로 작성합니다).Win32 API에서 스레드 로컬 저장소를 동적으로 해제하는 방법이 있습니까?

사실 내가 기본적으로 스레드 로컬 저장소를 사용하기 위해 힙에 자체 공간을 할당하고 TlsSetValue에 대한 포인터를 전달해야하는 상황이있는 것처럼 보이지만 스레드가 종료되면 ... 메모리를 보장하는 방법은 명시 적으로 TlsGetValuedelete/free/HeapFree/등 스레드 함수의 마지막에 호출 사람 이외의 다른 (해제되지 않았다있다.

는 사람이 더 좋은 방법을 알고 있나요?

+1

스레드는 어떻게 종료됩니까? 일반적인 방법은 threadproc이 반환되기 전에 정리하는 것입니다. –

답변

3

항목 이유 코드가인 스레드 종료시 DLL (DLLmain)이 호출됩니다.. thread exit에서 호출 할 함수를 추적하는 DLL을 작성하는 것은 매우 간단합니다.

또는 Boost.Threadboost::this_thread::at_thread_exit 함수를 사용하여 스레드 종료시 호출 할 함수를 등록하거나 boost::thread_specific_ptr을 사용하여 TLS 사용을 완전히 래핑하십시오. 당신은 자신에게 좋은 "종결 자"를 얻을 수

3

스레드가 종료 된 경우에도, 스레드 별 리소스를 제거합니다 : 스레드 '핸들 (DuplicateHandle 통해) 사본에 기다릴 RegisterWaitForSingleObject를 사용 - 당신에게 입니다. 복제 된 핸들을 사용하면 등록 된 대기열이 처리 할 수 ​​없습니다. {의도가 없음} 마감.
완료된 리소스를 보유하기 위해 힙 할당 구조/레코드를 사용하여 핸들이 대기하고 핸들이 대기합니다. 최종 스레드가 최종 스레드가 아닌 시스템 스레드 풀에서 실행됩니다. 시간). 파이널 라이저를 마무리하는 것을 잊지 마세요 :)