_beginthreadex 예제

운영 체제는 _beginthread 또는 _beginthreadex가 호출될 때 스택의 할당을 처리합니다. 스레드 스택의 주소를 이러한 함수 중 하나에 전달할 필요가 없습니다. 또한 stack_size 인수는 0이 될 수 있으며, 이 경우 운영 체제는 주 스레드에 지정된 스택과 동일한 값을 사용합니다. 다음 코드는 이전 코드와 동일합니다. 그러나이 예제는 WaitForMultipleObjects()를 사용하고 있습니다. arglist는 새로 생성된 스레드에 전달할 매개 변수입니다. 일반적으로 문자 문자열과 같은 데이터 항목의 주소입니다. arglist는 필요하지 않은 경우 NULL이 될 수 있지만 _beginthread 및 _beginthreadex는 새 스레드에 전달하기 위해 몇 가지 값을 부여해야합니다. 스레드가 중단, 종료, _exit 또는 ExitProcess를 호출하면 모든 스레드가 종료됩니다.

_beginthreadex()를 호출하는 것은 _beginthread()로 어려움을 피할 수 있습니다. 스레드가 종료되면 _beginthread()에 대한 호출로 반환된 핸들이 유효하지 않거나 다시 사용됩니다. 따라서 스레드의 상태를 쿼리하거나 스레드에 대한 핸들이 원래 가리키는 동일한 스레드의 핸들이라고 확신할 수 없습니다. 다음 예제에서는 이 문제를 보여 줍니다. 그러나 권장되는 방법은 스레드가 실행하도록 지시된 함수를 종료하는 것입니다. 다음 예제에서는 스레드가 해당 ID를 인쇄한 다음 LIBCMT에 연결된 실행 파일의 경우 종료합니다. LIB는 Win32 ExitThread() API를 호출하지 않습니다. 이렇게 하면 런타임 시스템에서 할당된 리소스를 회수할 수 없습니다. _endthread() 및 _endthreadex() 할당된 스레드 리소스를 회수한 다음 ExitThread()를 호출합니다. 운영 체제는 _beginthread() 또는 _beginthreadex()가 호출될 때 스택의 할당을 처리합니다. 스레드 스택의 주소를 이러한 함수 중 하나에 전달할 필요가 없습니다.

또한 stack_size 인수는 0이 될 수 있으며, 이 경우 운영 체제는 주 스레드에 대해 지정된 스택과 동일한 값을 사용합니다. arglist는 새로 생성된 스레드에 전달할 매개 변수입니다. 일반적으로 문자 문자열과 같은 데이터 항목의 주소입니다. arglist 필요 없는 경우 NULL 일 수 있지만 _beginthread() 및 _beginthreadex()는 새 스레드에 전달할 몇 가지 값을 제공해야 합니다. 모든 스레드는 모든 스레드가 abort(), exit(), _exit() 또는 ExitProcess()를 호출하는 경우 종료됩니다. KB 기사 132078 (“사용 방법 _beginthreadex() 및 _endthreadex()”)는 보관된 것 같기 때문에 여기에 요약합니다. 기본적으로 _beginthreadex() 및 _endthreadex()를 사용하는 것이 좋으며 샘플 프로그램이 있습니다. 위의 샘플은 KB 문서에서 샘플의 개선 된 버전입니다. _endthread() 또는 _endthreadex()를 명시적으로 호출하여 스레드를 종료할 수 있습니다. 그러나 _endthread() 또는 _endthreadex(_endthreadex)는 스레드가 _beginthread() 또는 _beginthreadex()로 매개 변수로 전달된 루틴에서 반환될 때 자동으로 호출됩니다. _endthread() 또는 _endthreadex()를 호출하여 스레드를 종료하면 스레드에 할당된 리소스의 적절한 복구를 보장하는 데 도움이 됩니다.

Win32 API CreateThread() 및 EndThread()를 사용하는 것은 CRT(C 런타임) 라이브러리와 직접 호환되지 않습니다. 특히 CreateThread() 및 EndThread()를 직접 사용하면 CRT가 할당하는 메모리가 손실될 수 있습니다. 대신 _beginthread() 및 _endthread() 또는 _beginthreadex() 및 _endthreadex()를 사용해야 합니다. _beginthread() 및 _beginthreadex() 함수는 새로 생성된 스레드에 핸들을 반환합니다. 그러나 함수 호출의 실제 반환 형식은 개체 핸들을 예상하는 함수 호출에 사용되기 전에 HANDLE에 형식 캐스팅되어야 하는 uintptr_t입니다. 여기서 사용한 스레드 함수 시그니처는 사용한 것과 다릅니다: 서명되지 않은 내용을 반환하고 __stdcall 호출 규칙을 사용합니다.

カテゴリー: 未分類   パーマリンク

コメントは受け付けていません。