2013-10-27 2 views
0

해당 코드 블록에서 코드 섹션을 실행중인 스레드가 변경 될 수 있습니까?CurrentThreadID가 변경 될 수 있습니까?

스레드 풀에 대해 메서드가 실행되는 ASP.net 내에서 코드가 실행되도록 특별히 생각하고 있습니다.

내 코드가 I/O 작업 (예 : 데이터베이스)을 시작하면 I/O 완료 포트가 완료 될 때까지 실행이 일시 중단됩니다. 그 동안 스레드 풀 스레드를 다시 사용하여 다른 웹 요청을 처리 할 수 ​​있습니다.

내 입출력이 완료되고 코드가 스레드 풀 스레드로 반환 될 때 동일한 스레드가 보장됩니까?

예.

private void DoStuff() 
{ 
    DWORD threadID = GetCurrentThreadID(); 

    //And what if this 3rd party code (e.g. ADO/ADO.net) uses completion ports? 
    //my thread-pool thread is given to someone else(?) 
    ExecuteSynchronousOperationThatWaitsOnIOCompletionPort(); 

    //Synchronous operation has completed 

    threadID2 = GetCurrentThread(); 
} 

그것은

threadID2 <> threadID 

수 있습니까?

.NET Thread Pool에 대해 언급했지만 네이티브 스레드 풀도 있습니다. 그리고 나는 둘 다에 대한 코드를 작성했습니다.

인가 그것을 ThreadID 저 아래에서 찢어 될 제에 대한 가능? 이제까지.

왜 신경 써야하나요?

내가 스레드 보안 개체를 만들려고하기 때문에 내가 걱정하는 이유입니다. 즉, 때로는 소위 "스레드"이라는 메소드를 호출해야한다는 것을 알아야합니다. 나중에 그들이 돌아 오면, 나는 "그들"이 여전히 "그들"이라는 것을 압니다.

"가상 처리 단위 하나에 의해 실행되도록 작성된 일련의 기계어"를 확인하는 유일한 방법은입니다. GetCurrentThreadID입니다. 그러나 GetCurrentThreadID이 변경되면; 실행 중에 일련의 기계 명령어가 "가상 프로세싱 유닛" (즉 스레드)으로 이동할 수 있다면 GetCurrentThreadID에 의존 할 수 없습니다.

+0

이러한 보장을받을 수 없기 때문에 사용자 정의 CLR 호스트는 스레드를 적절하게 구현할 수 있습니다. 스레드 풀은 사용자 정의 가능한 항목이기도합니다. 물론, 당신은 그것으로 도망 갈 것이다. 어쨌든 오늘. –

답변

0

짧은 대답은 아니오입니다. 동기 기능이 없다.

충분한 영리함과 악의로 당신은 이것을 한 기능을 만들 수 있습니다. 그러나, 당신은 그것을 깨뜨리기를 기대할 것입니다. 그래서 아무도 실제로 이것을하지 않습니다.

가장 중요한 문제는 - 호출하는 스레드가 동기 호출 기간 동안 잠금을 보유하고 있으면 어떻게 될까요?

관련 문제