2012-03-21 3 views
1

개별 스레드에서 파이프 라인을 처리하는 응용 프로그램에서 작업하고 있습니다. 테스트 과정에서 프로세스가 "경량"이거나 CLR이 이것이 곧 종료 될 것으로 판단하면 CLR은이 스레드를 빠르게 재사용하고 여러 작업 단위가 같은 스레드를 동시에 공유 할 수 있음을 확인했습니다.CLR 관리 스레드 : 가벼운 프로세스와 무거운 프로세스

반대로 프로세스가 약간의 시간이 걸리거나로드가 많으면 CLR이 다른 스레드를 엽니 다.

저에게 모두 어려운 TLS Thread local storage 프로그래밍.

사실 내 응용 프로그램 파이프 라인은 처리하는 데 약간의 시간이 걸리고 CLR은 항상 서로 관리되는 하나의 스레드를 할당하는 것처럼 보입니다. BTW 어떤 경우에는 두 개의 파이프 라인이 하나의 관리되는 스레드를 공유하는 경우 TLS 변수를 사용하기 때문에 충돌합니다.

결국 여기에 진짜 질문이 온다 ... 나는 프로세스가 약간의 시간 /로드를 필요로 할 때 항상 자신의 쓰래드를 사용할 것인가, 아니면 그 일을 미친 것일까?

.net 3.5에서 관리되는 스레드를 읽는 것은 일종의 블랙 박스로 동작하는 것과 같습니다. 그래서 아마도이 질문은 실제로는 결코 응답 될 수 없습니다.

편집 : 나는 사전 정의 결과 당신이 작업 관리자에서 확인하지 않는 컴퓨터 프로세스를 초래하는 행위, 변경, 또는 함수의 일련의 refereing하고 프로세스

.

+2

'프로세스'를 정의하십시오. 프로세스 사용은 표준 정의와 다소 차이가 있습니다. –

+1

변수가 실제로 스레드 당 의도되지 않은 경우 스레드 로컬 저장소를 사용하지 마십시오. 활동 당 필요하면 해당 변수를 주어진 활동과 연관 시키십시오. – dlev

+1

이 질문을 읽기 어렵습니다. 나는 실행중인 스레드가 적시에 완료되지 않을 때 추가 스레드를 시작하는 스레드 풀 관리자를보고 있다고 가정합니다. –

답변

1

나는 프로세스가 시간이 걸리는 경우 /이 항상 자신의 스레드를 사용합니다로드, 또는 내가

Process은 항상 자신의 스레드를 사용하고 미친임을 가정 할 수 있습니다. 다른 프로세스의 스레드에 액세스 할 수는 없습니다.

+0

두 CLR 프로세스/작업이 동일한 관리되는 스레드를 공유 할 수 있다면 문제라는 것을 알고 있습니다. – guillem

+0

@guillem : 사실 나는 그것이 가능하다는 것을 ** 내가 알고있는만큼 ** 대응할 수 있다고 응답합니다. – Tigran

+0

실제로 실제로 내가 본 것은 조치가 오래 걸리지 않으면 다른 사람과 동일한 'managedThreadId'를 공유 할 수 있으므로 CLR이 결정하지만 동일한 스레드를 공유 할 수 있다는 것입니다. – guillem

0

스레드 풀 스레드에서 실행되는 코드는 스레드 로컬 저장소에 finally 블록을 통해 제거하지 않을 내용을 배치해서는 안됩니다. 해당 코드가 실행 된 후에 코드 조각에 사용 된 스레드 로컬 저장소가 손상되지 않도록하려면 저장소를 정리하거나 자체 스레드에서 해당 코드를 명시 적으로 실행해야합니다.

+0

나는 그걸 알지 못했다. 가비지 수집기에 대한 직업이 아닌가? 디버거로 이것을 볼 수 있습니까? '[ThreadStatic]'데코레이터를 사용하면 어떨까요? – guillem

+1

@guillem : 가비지 컬렉터의 임무는 그렇지 않으면 액세스 할 수없는 메모리의 재사용을 허용하는 것입니다. 스레드 풀에서 호출 한 루틴이 [ThreadStatic] 필드를 설정하고 스레드가 설정되어있는 동안 종료하면 해당 필드는 threadpool *에서 실행되는 모든 루틴에서 액세스 할 수 있으며 동일한 스레드 *가 제공됩니다. 필드에 액세스 할 수있는 일련의 이벤트가 있기 때문에 가비지 수집기는이를 보존해야합니다. 가비지 컬렉터의 저평가 된 특성 중 하나는 무언가가 "유용 할"것인지 "유용 할 것"인지에 대한 최소한의 개념을 가지고 있다는 것입니다. – supercat

+0

@guillem : 'WeakReference'에 보관 된 항목과 'Object.Finalize'를 재정의하는 항목은 특별한 경우입니다. 가비지 수집기는 대상에 대한 강력한 참조가 없을 때 'WeakReference'를 무효화 할 수 있기 때문에 특별한 경우입니다. 마무리는 대기열에 있지만 다른 곳에서는 참조가 없습니다. 그러나 이러한 경우를 제외하고는 객체를 참조 할 수있는 수단이 있다는 사실은 가비지 컬렉터가 객체를 누락하지 않고 사라질 수 있더라도 가비지 수집자가 해당 객체를 수집하지 못하도록합니다. – supercat