2010-06-12 3 views
6

저는 Parallel Extensions를 상당히 많이 사용하고 있습니다. 스레드 로컬 저장소를 사용하면 작업 스레드가 개체를 재사용 할 수있는 경우가 있습니다. 이와 같이 정적 필드/변수를 스레드마다 고유 한 값으로 표시하는 ThreadStatic 특성을 살펴 보았습니다.ThreadStatic 특성이있는 병렬 확장 사용. 메모리가 누출 될 수 있습니까?

PE의 스레드 재사용을 보장하지 않으면 서 ThreadStatic 속성과 함께 PE를 사용하는 것은 현명하지 않은 것처럼 보입니다. 즉, 쓰레드가 생성되고 어느 정도 파괴되면 변수 (따라서 객체가 가리키는 객체)가 일정하지 않은 시간 동안 스레드 로컬 저장소에 남아있어 메모리 누수가 발생합니다. 아니면 스레드 저장소가 스레드에 연결되어 있고 스레드가 처리 될 때 처리 되었습니까? 그런데도 여전히 풀에 오래 살아 있고 스레드가 사용되는 다양한 코드 조각에서 스레드 로컬 저장소를 축적하는 스레드가있을 수 있습니다.

PE로 스레드 로컬 스토리지를 얻는 더 좋은 방법이 있습니까?

고마워요.

+0

풀에서 스레드를 제거한 다음 스택에서 섞은 스레드와 관련하여 올바른 용어가 "폐기"됩니다. –

답변

5

스레드 로컬 저장을위한 일반 패턴 사용을 강력하게 권장합니다 (이 내용은 MSDN article에 설명되어 있음).

[ThreadStatic]을 사용하면 스레드 풀 스레드가 종료 될 때 TLS 변수를 정리할지 여부가 중요합니다. MSDN 문서에는 제안 사항이 없습니다. 구현하기가 어렵지는 않으며 TlsFree() API 함수 만 호출하면됩니다. 나는 약간의 테스트 앱을 썼다. 어떤 누설의 흔적도 없다.

4

편집 : 한스의 대답을 감안할 때, 그것은 소리 TLS 실제로 어쨌든 정리 될 것 같은 ... 그냥 대답이 비트 잎있는 :

당신이 정말 내에서 값을 재사용하는 더 좋은 방법이 없습니다 수행을 실? 동일한 스레드를 사용하는 두 개의 작업 (하나는 완료 한 후 다른 작업은)이 실제로 동일한 값을 원하게됩니까? 실제로이 작업을 통해보다 제어 된 방식으로 데이터를 전파하는 것을 피하는 방법으로 이것을 사용하고 있습니까?

+0

이 시나리오는 그리드 기반의 '세계'시뮬레이션으로서, 상기 세계에서 에이전트 집합을 독립적으로 평가합니다. 따라서 병렬로 실행하려면 각 병렬 루프 내에서 새로운 세계를 만들고 사용하고 폐기 할 수 있습니다. 내 의도는 다시 사용할 수 있도록 Reset() 메서드를 세계에 두는 것이 었습니다. 정적 로컬 스토리지가 풀에 대한 잠긴 액세스와 관련된 '세계'의 내 자신의 풀을 관리해야 함을 알게되었습니다. – redcalx

+0

@ the-locster : 나는 여전히 스레드의 이점을 보지 못합니다. - 로컬 저장소가 여기에 있습니다. 작업 내에 있다면 참조를 계속 유지하는 것이 좋습니다. –

+0

각 평가는 하나의 에이전트를 하나의 세계에 모두 넣습니다. 따라서 8 개의 CPU 코어/스레드가 있다면 주어진 시간에 8 개의 독립적 인 세계가 시뮬레이트됩니다. 스레드 당 하나의 월드입니다. – redcalx

관련 문제