2008-09-25 2 views
9

ThreadStatic attribute은 정적 변수를 스레드별로 고유하게 선언합니다. 그런 변수를 올바르게 처리하는 쉬운 패턴을 알고 있습니까?ThreadStatic 객체를 결정적으로 처리합니다.

ThreadStatic 이전에 사용한 것은 ThreadContextManager입니다. 모든 thread에는, 모든 thread 고유의 정보를 보관 유지하는 ThreadContext가 할당되었습니다. 우리는 몇 가지 스레드를 생성하고 작동하도록했습니다. 그런 다음 모두 끝나면 ThreadContentManager가 삭제되고 IDisposable 인 경우 모든 컨텍스트가 삭제됩니다.

이 패턴을 ThreadStatic 객체로 즉시 변환하는 방법은 없습니다. 스레드는 죽기 때문에 객체는 결국 처리됩니다. 따라서 아무것도 참조하지 않습니다. 그러나 우리는 가능한 언제든지 결정론적 처분을 선호합니다.

업데이트

정말 직접 스레드를 제어하지 않습니다 - 나는 작업을 수행하는 ThreadPool이되어있는 Microsoft CCR을 사용하고 있습니다. 모든 작업이 완료되면 Dispatcher (스레드 풀을 보유 함)를 삭제합니다. 문제는 "스레드의 주요 기능 끝에"아무 것도 할 수있는 기회를 얻지 못하기 때문에 스레드가 끝날 때 수동으로 처리 할 수 ​​없습니다. 어떻게 든 스레드 외부에서 스레드의 정적 객체에 액세스 할 수 있습니까?

답변

1

ThreadContextManager 클래스와 동일한 기능을 사용하여 dispose를 처리 할 수 ​​있습니다. 생성 된 쓰레드는이 'manager'객체를 처리하며,이 객체는 알고있는 다른 모든 스태틱 정적 객체를 차례로 가져옵니다.

상대적으로 스레드 정적 객체를 상대적으로 적게 사용하고 대신 컨텍스트 객체를 사용하는 것을 선호합니다. 이렇게하면 스레드 특정 상태가 몇 군데에만 유지되므로이 같은 패턴을 쉽게 만듭니다.

업데이트 : 스레드 풀을 처리하기 위해 스레드 풀에 전달하는 기본 '작업'개체를 만들 수 있습니다. 코드가 필요로하는 일반 초기화를 수행하고 '실제'태스크를 호출 한 다음 필요한 정리 작업을 수행 할 수 있습니다.

+0

모든 작업 후에 정리를하고 싶지 않습니다. 내 스레드 풀의 주어진 스레드는 많은 작업을 순차적으로 수행합니다. 컨텍스트가있는 이유는 작업 당 값 비싼 데이터 구조 할당을 절약하기 위해서입니다. 이것은 모든 스레드가 완료된 후에 만 ​​정리할 수 있음을 의미합니다. – ripper234

관련 문제