2013-01-13 2 views
8

저는 Windows API의 초보자입니다. 최근에 CreateThread와 TerminateThread를 사용하지 말아야한다는 것을 배웠습니다. 내가 _beginthreadex로 바꿨지 만, 내가 어떻게 해야할지 모르겠다. use _endthreadex?어디에 _endthreadex - windows API를 사용합니까?

// MyThreadFunction - outputs "#.) I Work" and ends 
unsigned int __stdcall MyThreadFunction(void * lpParam) 
{ 
    int i = (int)lpParam; 
    cout << i << ".) I work! " << endl; 
    _endthreadex(0); 
    return 0; 
} 

_endthreadex의 내 위치가 정확 :

예를를 들어, 여기에 내가 함께 테스트 된 기본 기능은 무엇입니까? 나는 0으로 돌아 가기 전에 그것을 가지고있다. 그것은 나에게 이상하게 보인다? 나는 _endthreadex에 대한 msdn 페이지에서 함수가 끝날 때 자동으로 호출되지만 더 나은 메모리 정리를 위해 호출해야합니다. 그래서 그 코드를 넣으려고 한 것입니다. 올바르게 보이지 않습니다. 죄송합니다. 나쁜 질문. 나는 능력을 최대한 발휘하여 최선을 다하고 있습니다.

+1

CreateThread를 사용할 때 아무런 문제가 없습니다. 아직 고대의 MSVC를 사용하지 않는 한. –

+0

@DavidHeffernan _begin/_endthread를 사용하지 않으면 정적으로 연결된 CRT에 메모리 누수 문제가 있습니다. 이 변화에 대한 참고 자료가 있습니까? –

답변

9

실제로는 _endthreadex()으로 전화하지 않아도됩니다. 어쨌든 스레드 함수가 반환 된 후에 자동으로 호출됩니다.

2

이미 언급 한 것처럼 호출 할 필요가 없습니다. 귀하의 코드에 관해서는 _endthreadex() 결코 반환하지 않기 때문에 최종 return 0; 심지어 호출되지 않습니다 생각합니다. 이것은 또한 로컬 객체의 소멸자가 호출되지 않도록 할 수 있습니다 (MSDN이 말하고자하는 바입니다). 따라서이 함수를 사용하면 C++에서도 해를 끼칠 수 있습니다. Boost.Thread를 사용하는 것을 고려해보십시오. 중간에 스레드를 종료하고 싶다면 특별히 스레드를 끝내기위한 예외가 있습니다.

3

답변은 이미 짧은 버전으로 제공되며 자세한 내용을 알고 싶다면 실제로 함수에서 반환하는 것이 _endthreadex 호출의 인수로 사용됩니다. 다음은 스레드를 시작할 때 런타임이 수행하는 작업입니다. 스레드는 실제로 내부 _callthreadstartex가하고있는 곳 CRT, 어딘가 출발점으로 시작 :

즉시 반환 등이다
_endthreadex(MyThreadFunction(...)); 

, _endthreadex 즉시 당신을 위해 호출됩니다 그리고 그것은 스레드에서 종료됩니다.

명시 적으로 사용할 수 있습니까? 예, 할 수 있습니다. 코드가 좋으면 코드를 직접 호출하든 호출 할 것인지는 중요하지 않습니다. 단, 누수가 발생하지 않는다면 (예 : 특히 소멸자라고 부르지 않음) 지역 변수).

어쨌든 당신을 위해 호출 될 것이고 기능에서 돌아 오는 것이 지역 자원을 자유롭게한다는 측면에서 더 안전 할 것이므로 명시 적 호출을하는 데 사용, 장점 및 의미는 없습니다.

MSDN은 기본적으로 정확히 동일한 내용을 Remarks section에 설명합니다.

_endthread 또는 _endthreadex를 명시 적으로 호출하여 스레드를 종료 할 수 있습니다. 그러나 스레드가 매개 변수로 전달 된 루틴에서 _beginthread 또는 _beginthreadex로 돌아 오면 _endthread 또는 _endthreadex가 자동으로 으로 호출됩니다. endthread 또는 _endthreadex를 호출하여 스레드를 종료하면 스레드에 할당 된 자원 의 적절한 복구를 보장 할 수 있습니다.

관련 문제