CreateThread 함수(processthreadsapi.h)
호출 프로세스의 가상 주소 공간 내에서 실행할 스레드를 만듭니다.
다른 프로세스의 가상 주소 공간에서 실행되는 스레드를 만들려면 CreateRemoteThread 함수를 사용합니다.
구문
HANDLE CreateThread(
[in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] SIZE_T dwStackSize,
[in] LPTHREAD_START_ROUTINE lpStartAddress,
[in, optional] __drv_aliasesMem LPVOID lpParameter,
[in] DWORD dwCreationFlags,
[out, optional] LPDWORD lpThreadId
);
매개 변수
[in, optional] lpThreadAttributes
반환된 핸들을 자식 프로세스에서 상속할 수 있는지 여부를 결정하는 SECURITY_ATTRIBUTES 구조체에 대한 포인터입니다. lpThreadAttributes가 NULL이면 핸들을 상속할 수 없습니다.
구조체의 lpSecurityDescriptor 멤버는 새 스레드에 대한 보안 설명자를 지정합니다. lpThreadAttributes가 NULL이면 스레드는 기본 보안 설명자를 가져옵니다. 스레드에 대한 기본 보안 설명자의 ACL은 작성자의 기본 토큰에서 가져옵니다.
[in] dwStackSize
스택의 초기 크기(바이트)입니다. 시스템은 이 값을 가장 가까운 페이지로 반올림합니다. 이 매개 변수가 0이면 새 스레드는 실행 파일의 기본 크기를 사용합니다. 자세한 내용은 스레드 스택 크기를 참조하세요.
[in] lpStartAddress
스레드에서 실행할 애플리케이션 정의 함수에 대한 포인터입니다. 이 포인터는 스레드의 시작 주소를 나타냅니다. 스레드 함수에 대한 자세한 내용은 ThreadProc을 참조하세요.
[in, optional] lpParameter
스레드에 전달할 변수에 대한 포인터입니다.
[in] dwCreationFlags
스레드 만들기를 제어하는 플래그입니다.
값 | 의미 |
---|---|
|
스레드는 만든 직후에 실행됩니다. |
|
스레드는 일시 중단된 상태로 만들어지고 ResumeThread 함수가 호출될 때까지 실행되지 않습니다. |
|
dwStackSize 매개 변수는 스택의 초기 예약 크기를 지정합니다. 이 플래그를 지정하지 않으면 dwStackSize 는 커밋 크기를 지정합니다. |
[out, optional] lpThreadId
스레드 식별자를 수신하는 변수에 대한 포인터입니다. 이 매개 변수가 NULL이면 스레드 식별자가 반환되지 않습니다.
반환 값
함수가 성공하면 반환 값은 새 스레드에 대한 핸들입니다.
함수가 실패하면 반환 값은 NULL입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.
lpStartAddress가 데이터, 코드를 가리키거나 액세스할 수 없는 경우에도 CreateThread가 성공할 수 있습니다. 스레드가 실행되면 시작 주소가 유효하지 않으면 예외가 발생하고 스레드가 종료됩니다. 잘못된 시작 주소로 인한 스레드 종료는 스레드 프로세스에 대한 오류 종료로 처리됩니다. 이 동작은 CreateProcess의 비동기 특성과 유사합니다. 여기서 프로세스는 유효하지 않거나 누락된 DLL(동적 연결 라이브러리)을 참조하더라도 만들어집니다.
설명
프로세스가 만들 수 있는 스레드 수는 사용 가능한 가상 메모리에 의해 제한됩니다. 기본적으로 모든 스레드에는 1MB의 스택 공간이 있습니다. 따라서 boot.ini 옵션이 없 /3GB
으면 32비트 시스템에서 2,048개 이상의 스레드를 만들 수 없습니다. 기본 스택 크기를 줄이면 더 많은 스레드를 만들 수 있습니다. 그러나 프로세서당 하나의 스레드를 만들고 애플리케이션이 컨텍스트 정보를 유지하는 요청 큐를 빌드하는 경우 애플리케이션의 성능이 향상됩니다. 스레드는 다음 큐에서 요청을 처리하기 전에 큐의 모든 요청을 처리합니다.
새 스레드 핸들은 THREAD_ALL_ACCESS 액세스 권한으로 만들어집니다. 스레드를 만들 때 보안 설명자가 제공되지 않으면 스레드를 만드는 프로세스의 기본 토큰을 사용하여 새 스레드에 대한 기본 보안 설명자가 생성됩니다. 호출자가 OpenThread 함수를 사용하여 스레드에 액세스하려고 하면 호출자의 유효 토큰이 이 보안 설명자에 대해 평가되어 액세스 권한을 부여하거나 거부합니다.
새로 만든 스레드는 GetCurrentThread 함수를 호출할 때 자체에 대한 모든 액세스 권한을 가집니다.
Windows Server 2003: 스레드 자체에 대한 액세스 권한은 스레드에 대해 생성된 기본 보안 설명자에 대해 스레드가 만들어진 프로세스의 기본 토큰을 평가하여 계산됩니다. 스레드가 원격 프로세스에서 만들어지면 원격 프로세스의 기본 토큰이 사용됩니다. 따라서 새로 만든 스레드는 GetCurrentThread를 호출할 때 자체에 대한 액세스 권한을 줄일 수 있습니다. THREAD_SET_THREAD_TOKEN 및 THREAD_GET_CONTEXT 포함한 일부 액세스 권한이 없을 수 있으므로 예기치 않은 오류가 발생할 수 있습니다. 따라서 다른 사용자를 가장하는 동안 스레드를 만드는 것은 권장되지 않습니다.
스레드가 실행 가능한 상태로 만들어진 경우(즉, CREATE_SUSPENDED 플래그를 사용하지 않는 경우) 스레드는 CreateThread 가 반환되기 전에, 특히 호출자가 생성된 스레드의 핸들과 식별자를 받기 전에 실행을 시작할 수 있습니다.
스레드 실행은 lpStartAddress 매개 변수로 지정된 함수에서 시작됩니다. 이 함수가 반환되는 경우 DWORD 반환 값은 ExitThread 함수에 대한 암시적 호출에서 스레드를 종료하는 데 사용됩니다. GetExitCodeThread 함수를 사용하여 스레드의 반환 값을 가져옵니다.
스레드는 THREAD_PRIORITY_NORMAL 스레드 우선 순위로 만들어집니다. GetThreadPriority 및 SetThreadPriority 함수를 사용하여 스레드의 우선 순위 값을 가져와서 설정합니다.
스레드가 종료되면 스레드 개체는 신호 상태가 되며 개체에서 대기 중인 모든 스레드를 충족합니다.
스레드 개체는 스레드가 종료되고 CloseHandle 호출을 통해 스레드에 대한 모든 핸들이 닫히기 전까지 시스템에 남아 있습니다.
ExitProcess, ExitThread, CreateThread, CreateRemoteThread 함수 및 시작하는 프로세스(CreateProcess 호출의 결과로)는 프로세스 내에서 서로 직렬화됩니다. 이러한 이벤트 중 하나만 한 번에 주소 공간에서 발생할 수 있습니다. 즉, 다음과 같은 제한 사항이 있습니다.
- 프로세스 시작 및 DLL 초기화 루틴 중에 새 스레드를 만들 수 있지만 프로세스에 대해 DLL 초기화가 완료될 때까지 실행을 시작하지 않습니다.
- 프로세스의 스레드는 한 번에 하나의 스레드만 DLL 초기화 또는 분리 루틴에 있을 수 있습니다.
- ExitProcess 는 DLL 초기화 또는 분리 루틴에 스레드가 없을 때까지 완료되지 않습니다.
Windows Phone 8.1: 이 함수는 Windows Phone 8.1 이상에서 Windows Phone 스토어 앱에서 지원됩니다.
Windows 8.1 및 Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상에서 Windows 스토어 앱에서 지원됩니다.
예제
예제는 스레드 만들기를 참조하세요.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | processthreadsapi.h(Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2에 Windows.h 포함) |
라이브러리 | Kernel32.lib; Windows Phone 8.1의 WindowsPhoneCore.lib |
DLL | Kernel32.dll; Windows Phone 8.1의 KernelBase.dll |