쓰레드와 쓰레드 동기화 II Study+more

쓰레드와 쓰레드 동기화.

이 전 시간에 해결하지 못한 질문들을 먼저 해결해 보도록 하자.

1. CRITICAL_SECTION의 LockCount와 RecursionCount, SpinCount가 뭘 의미하는지 모르겠음.
2. PEB에는 크리티컬 센션(구조체가) 하나 존재한다. 코드에서 크리티컬 섹션 객체를 2개 이상 생성하면 잘 작동하는가? 그 이유는?
::크리티컬 섹션 구조체 내부에는 디버그 구조체가 존재한다. 디버그 구조체 내부에는 링크드 리스트를 위한 리스트 엔트리가 존재하며, 리스트 엔트리가 생성된 크리티컬 섹션을 리스트로 연결한다.
3. 크리티컬 섹션 객체와 동일한 역할을 하는 뮤텍스가 존재하는 이유는 무엇인가?
::크리티컬 섹션은 단일개의 프로세스 내부에서만 사용이 가능하며, (이름있는)뮤텍스는 다수개의 프로세스에서의 동기화에도 사용할수 있다. (OpenMutex 이용)
4. 크리티컬 섹션도 내부적(구조체)에 핸들을 가지고 있다. 이 말은 결국 크리티컬 섹션 객체도 커널영역에 직접 엑세스 한다는 의미가 아닌가?
::LockSemaphore  This field is misnamed; it's really an auto-reset event, not a semaphore. It's a kernel object handle and it's used to signal the operating system that the critical section is now free. The operating system silently creates one of these the first time a thread tries to acquire the critical section, but is blocked by another thread already owning it. You should call DeleteCriticalSection (which issues a CloseHandle call on the event and frees the debug structure if necessary) or a resource leak will occur.
(Referenced From : http://msdn.microsoft.com/msdnmag/issues/03/12/CriticalSections/default.aspx )
5. 쓰레드가 리스트에 의해 라운드로빈 방식으로 실행된다면 어째서 쓰레드가 순차적으로 실행되지 못하는가?
::쓰레드가 선택되어 CPU를 사용하는 동안 그 쓰레드는 자신이 의도한 코드들 외에 많은 DCP/Dispatch 이상의 코드들에 의해 CPU를 선점당할수 있으며, 이러한 이유로 실제 쓰레드 자신의 코드를 위하여 CPU 를 사용하는 시간은 줄어들게 된다. (이 때문인듯 하다.)
(Referenced From : 윈도우즈 구조와 원리 - 정영덕 )
6. 이벤트 객체가 시그널 상태가 되면, 넌 시그널 상태가 되기 전까지 몇개의 쓰레드라도 임계영역에 진입할수 있는가? 아니면 한개의 쓰레드만 임계영역으로 접근 가능한가?
[[::자동리셋 모드와 수동 리셋모드에 따라 다르다. ((좀더 조사해 볼것)) ]]
7. _try{} _finally{} 구문을 포함하는 쓰레드 프로시저를 exitThread(), terminateThread() 함수를 호출하여 쓰레드를 죽여버렸을 경우, _finally{}구문이 실행되는가?
::두 경우 모두 _finally{}이 실행 안됨.
8. _beginthreadex와 CreateThread의 차이는?

더불어 오늘 오후 내내 붙잡고 있었던.. 그리고 아직도 해결이 안되는 코드를 소개하면 오늘 수업은 끝..- .-;


... 크리티컬 섹션 디버그 구조체의 링크드 리스트가 정말로 다른 크리티컬 섹션을 가리키고 있는지 확인하려는 의도의 코드...
//
크리티컬섹션초기화//

InitializeCriticalSection(&gCSOne);

InitializeCriticalSection(&gCSTwo);

//크리티컬섹션초기화//


/*디버그 인포(디버그 구조체)의 리스트를 따라가서 이전(gCSOne) 크리티컬 섹션 객체의 디버그 구조체를 포인트*/

PCRITICAL_SECTION_DEBUGpCSTwo_DebugInfo =

    (PCRITICAL_SECTION_DEBUG)gCSTwo.DebugInfo->ProcessLocksList.Blink;

 

/*디버그 구조체에 있는 크리티컬 섹션 객체를 포인트하는 (포인터 값)을 복사(-?-)*/

PCRITICAL_SECTIONpCSOneFromCSTwo =

    (PCRITICAL_SECTION)(pCSTwo_DebugInfo->CriticalSection);

 

//아놔.. 왜!! 다 똑같은 메모리 가리켜야 하는거 아냐-0-?//

_tprintf(_T("address of gCSOne 0x%p\r\n"), gCSOne);

_tprintf(_T("address of gCSOne 0x%p (withCRITICAL_SECTION_DEBUG.CriticalSection)\r\n"),

    &(gCSOne.DebugInfo->CriticalSection));

_tprintf(_T("address of gCSOne 0x%p (with gCSTwo)\r\n"),

    &(pCSTwo_DebugInfo->CriticalSection));

 

//크리티컬섹션삭제//

DeleteCriticalSection(&gCSOne);

DeleteCriticalSection(&gCSTwo);

//크리티컬섹션삭제//


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://handmade.egloos.com/tb/3968298 [도움말]
  • 쓰레드와 스레드 동기화 III 2007/11/30 20:08 #

    쓰레드와 쓰레드 동기화 II 솔직히 이걸가지고 3편에 걸쳐서 쓰기(라고 적었지만.. 실제적인 내용은 이 앞으 포스팅으로 끝..)엔 너무 질질 끄는 느낌이다. 우선 파일하나 받으시고.. 남은 질문들은 다음과 같다. 테이블 핸들값을 3개의 레이어로 나눴다. 왜?! '3개'로 나눴을까? 2개, 4개는 안되나? 더 많이 나누면 메모리를 더 효율적으로 쓸수 있을거 같은데.. 왜! 굳이 3개로 나눴나?WinDbg로 핸들 카운트, 레포런스 카...... more

덧글

덧글 입력 영역