none
쓰레드 컨텍스트 스위칭 관련해서 궁금한 점이 있습니다. RRS feed

  • 질문



  • m_pThread = AfxBeginThread(Threadtest, this);

    쓰레드를 생성하였습니다.

    Threadtest 스레드 종료시점에

    UINT CThreadTestDlg::Threadtest(LPVOID pParam)
    {
     CThreadTestDlg* pThis = (CThreadTestDlg*)pParam;
     .

     .

     .
     pThis->m_pThread = NULL;
     return 0;
    }

    이렇게 CWinThread 로 받은 변수를 쓰레드 종료시점에 NULL로 Assign했을경우.

    부모쓰레드나 다른 쓰레드에서 종료 체크시(메인쓰레드)

    if (m_pThread)
    {
          WaitForSingleObject(m_pThread->m_hThread,INFINITE);
    }

    위 코드에 문제가 없는 지요?(제 생각엔 문제가 있을것 같은데, 아는 지인분과 의견이 달라서요.)

    즉 종료체크 코드의

    if (m_pThread) 조건문과

    WaitForSingleObject(m_pThread->m_hThread,INFINITE); 호출되는 시점 중간에

    쓰레드 종료 부분인  pThis->m_pThread = NULL; 부분 코드가 실행되어서 

    WaitForSingleObject 호출시 "m_pThread->m_hThread" 이부분의 m_pThread가 NULL되지 않는다는
    보장이 있느냐 입니다.

    아는 지인분의 말로는 if문과 WaitForSingleObject 허출 중간에 다른함수호출되는 부분이 없다면,

    쓰레드 컨텍스트 스위칭이 일어나지 않기때문에 그럴리가 없다 라고 했습니다.

    이 부분 관련해서 msdn과 구글링을 해봐도 관련 근거를 찾기 힘들군요.

    if문 라인과 if블럭안에  단순 int a= 1;이라든가 함수호출 사이에 컨텍스트 스위칭이 일어나지 않는다는 보장이 있는지요?

    코드레벨에서는 어디에서든 예측할 수 없게 컨텍스트 스위칭이 일어나는걸로 알고 있습니다.

    관련정보를 공식문서가 있으면 감사하겠습니다.

    추운날씨 감기 조심하세요~

    ---------------------------------------------------

    2014년 12월 23일 화요일 오전 4:01

답변

  • dearjhm님의 의견이 맞습니다. if 문과 WaitFor... 호출 사이에 다른 함수 호출의 유무와 상관없이 스레드 컨텍스트 스위칭이 발생할 수 있습니다. (원래, 선점형 스케쥴러가 그렇게 동작합니다.) 그리고 if 문은 컴파일하면 기계어로 xor, cmp, jne 등의 나열로 바뀌기 때문에 cmp 단계만 수행한 후 컨텍스트 스위칭이 발생하면 이후의 WaitForSingleObject에서는 m_pThread가 NULL이 될 수 있습니다.

    2014년 12월 24일 수요일 오전 12:56