exitthread 예제

호환 솔루션은 작업을 수행하는 동안 스레드가 무기한 절전 모드로 사용할 수 있으므로 반환되지 않는 경우 처리하기가 어려워집니다. 일반적인 예로는 네트워크 데이터를 기다리는 스레드가 있지만 더 많은 스레드가 있습니다. 각 스레드에는 고유한 스택이 있습니다(스레드 대 프로세스 참조). 아래 예제에서 CreateThread() 함수의 2번째 인수인 stackSize 매개 변수를 사용하여 새 스레드 스택의 크기를 바이트로 지정할 수 있습니다. 이 정수 값이 0이면 스레드에는 만드는 스레드와 크기가 같은 스택이 제공됩니다. _beginthreadex호출을 통해 생성된 스레드가 종료된 후에도 리소스는 계속 유지됩니다. 이러한 리소스는 핸들의 CloseHandle() 함수를 스레드에 호출하여 해제해야 합니다. 다음 예제에서는 스레드를 만들고 완료될 때까지 기다렸다가 리소스를 해제하는 전체 시퀀스를 보여 줍니다. _beginthreadex()에 의해 생성된 스레드는 CloseHandle()을 호출하여 정리해야 합니다. 따라서 WaitForSingleObject()에 대한 호출은 올바른 핸들을 얻을 수 있습니다: 위의 모든 c 런타임 라이브러리 함수는 process.h 헤더 파일에 있습니다. Microsoft Visual Studio 프로젝트 설정이 다중 스레드 DLL인지 확인합니다.

_beginthread 및 _beginthreadex 함수는 C 런타임 라이브러리에서 스레드를 만드는 데 사용됩니다. 그러나 이러한 함수에는 몇 가지 차이점이 있습니다. _beginthreadex에는 보안 및 스레드 주소와 같은 이내 매개 변수가 추가됩니다. _beginthread를 사용하여 스레드를 만들 때 스레드는 _endthread를 사용합니다. _endthread스레드 핸들을 자동으로 닫습니다. 그러나 _endthreadex를 사용하면 CloseHandle Win32 API 함수를 사용하여 nthread 핸들을 닫습니다. C 런타임 라이브러리에는 내부적으로 스레드 로컬 저장소(TLS)가 포함되어 있습니다. API 또는 컴파일러 특정 코드를 사용하여 스레드 로컬 저장소를 사용할 수 있습니다. TlsAlloc, TlsFree, TlsGetValue 및 TlsSetValue는 스레드 특정 데이터를 저장하는 데 사용됩니다. C 런 타임 라이브러리에 _beginthread 함수를 사용하는 경우 ExitThread 또는 CreateThread와 같은 Win32 API를 사용할 수 없습니다. 왜냐하면 해당 메서드를 사용하면 교착 상태가 발생할 수 있기 때문입니다. _beginthread는 스레드 만들기에서 여러 인수를 사용합니다.

우리의 예제 프로그램은 간단한 콘솔 기반 응용 프로그램입니다. 사용자가 만들 스레드 수를 입력한 다음 각 스레드를 실행합니다. 다음 코드는 이전 코드와 동일합니다. 그러나이 예제는 WaitForMultipleObjects()를 사용하고 있습니다. _beginthreadex()를 호출하는 것은 _beginthread()로 어려움을 피할 수 있습니다. 스레드가 종료되면 _beginthread()에 대한 호출로 반환된 핸들이 유효하지 않거나 다시 사용됩니다. 따라서 스레드의 상태를 쿼리하거나 스레드에 대한 핸들이 원래 가리키는 동일한 스레드의 핸들이라고 확신할 수 없습니다. 다음 예제에서는 이 문제를 보여 줍니다. 그러나 권장되는 방법은 스레드가 실행하도록 지시된 함수를 종료하는 것입니다. 다음 예제에서 스레드는 ID를 인쇄한 다음 종료합니다. 파이버는 이를 예약하는 스레드의 컨텍스트에서 실행됩니다.

각 스레드는 여러 파이버를 예약할 수 있습니다. 일반적으로 섬유는 잘 설계된 다중 스레드 응용 제품에 비해 이점을 제공하지 않습니다. 그러나 파이버를 사용하면 자체 스레드를 예약하도록 설계된 응용 프로그램을 쉽게 포팅할 수 있습니다. 시스템 관점에서 파이버는 이를 실행하는 스레드의 ID를 가정합니다. 예를 들어 파이버가 스레드 로컬 저장소(TLS)에 액세스하는 경우 이를 실행하는 스레드의 스레드 로컬 저장소에 액세스합니다. 또한 파이버가 ExitThread() 함수를 호출하면 파이버를 실행하는 스레드가 종료됩니다.

Comments are closed