2011-08-04 4 views
12

스레드 풀 스레드가 완료되면 이름 또는 스레드 로컬 데이터가 재설정 될 수 있습니까? 다음 번에 스레드가 풀에서 나올 때 새로운 스레드와 비슷합니까?.NET ThreadPool 스레드가 다시 풀로 돌아갈 때 스레드가 재설정됩니까?

ThreadPool 스레드의이 측면에 대한 "공식적인"문서가 있습니까?

+1

가능한 [ThreadStatic 특성이있는 병렬 확장 사용. 그것은 누수가 메모리가?] (http://stackoverflow.com/questions/3029449/using-parallel-extensions-with-threadstatic-attribute-could-it-leak-memory) –

답변

8

릴리스 될 때 스레드 로컬 저장소를 지우지 않습니다. 이것이 주목해야 할 가장 중요한 부분입니다.

스레드 풀 스레드 재사용

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

, 그것은 스레드 로컬 스토리지 또는 ThreadStaticAttribute 속성으로 표시되는 필드의 데이터를 삭제하지 않는다. 따라서 한 방법으로 스레드 로컬 저장소에 배치 된 데이터는 동일한 스레드 풀 스레드에서 실행되는 다른 방법 에 노출 될 수 있습니다. 속성이 ThreadStaticAttribute 속성으로 표시된 필드에 액세스하는 방법은 스레드 스레드 풀 스레드가 실행하는 것에 따라 다른 데이터가 발생할 수 있습니다. 이것은 매우 조심해야 할 일이다

...

+0

msdn에 대한 링크 주셔서 감사. 물론 2.0 버전을 보았을 때 정보 블록이 누락되었습니다. –

3

대답은 '아니오'입니다. 초기화되지 않습니다. 그러나 다음 작업 항목이 새 스레드에서 또는 재사용 된 스레드에서 실행되는지 여부는 스레드 풀에 달려 있기 때문에이 사실에 의존해서는 안됩니다. 따라서 로컬 저장소 다시 스레드를 볼 수도 있고 보지 않을 수도 있습니다. 스레드 풀에서 Thread Local Storage를 사용하는 것을 권장하지 않습니다. 스레드 풀 구현은 내부 세부 사항이며 변경할 수 있습니다.

현실 세계의 은유는 매일 일하는 버스가 될 것입니다. 어떤 이유로 든 가방을 도난 당하지 않을 것이므로 버스에두고 싶다고 말합니다. 다음에 버스에 타기 때문에 가방을 찾을 수 없기 때문에 이것은 나쁜 생각입니다. 단순히 다른 버스가 될 수 있기 때문입니다. 버스 디포는 라인 사이에서 버스를 회전 시키거나 오래된 버스를 처분 할 수 있습니다. 쓰레드 풀은 쓰레드를 재사용하거나 은퇴 할 수 있습니다.

관련 문제