한글: https://learn.microsoft.com/ko-kr/windows/win32/fileio/createiocompletionport
영어: https://learn.microsoft.com/en-us/windows/win32/fileio/createiocompletionport
<aside> 💡
CreateIoCompletionPort는 세 가지 고유한 모드에서 사용할 수 있습니다.
HANDLE WINAPI CreateIoCompletionPort(
_In_ HANDLE FileHandle, // 열려 있는 file handle 또는
// INVALID_HANDLE_VALUE이다.
_In_opt_ HANDLE ExistingCompletionPort, // 기존 I/O 완료 포트에 대한
// 핸들이거나 NULL입니다.
_In_ ULONG_PTR CompletionKey,
_In_ DWORD NumberOfConcurrentThreads
);
return이 HANDLE이다. 핸들에 대해 알아보자!
HANDLE 자체는 void*
타입이다.
여기에 사용된 파일 핸들이라는 용어는 디스크의 파일뿐만 아니라 Overlapped I/O 엔드포인트를 나타내는 시스템 추상화를 의미합니다. 네트워크 엔드포인트, TCP 소켓, 명명된 파이프 및 메일 슬롯과 같은 Overlapped I/O를 지원하는 모든 시스템 개체를 파일 핸들로 사용할 수 있습니다. - CreateIoCompletionPort 명세에서 발췌
예제
Iocp::Iocp(int threadCount)
{
m_hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, threadCount);
m_threadCount = threadCount;
}
FileHandle: **INVALID_HANDLE_VALUE
**를 지정하면 함수가 파일 핸들과 연결하지 않고 I/O 완료 포트를 만듭니다. 이 경우 ExistingCompletionPort 매개 변수는 NULL이어야 하며 CompletionKey 매개 변수는 무시됩니다.
ExistingCompletionPort: 이 매개 변수가 기존 I/O 완료 포트를 지정하는 경우 함수는 이를 FileHandle 매개 변수로 지정된 핸들과 연결합니다. 함수는 성공하면 기존 I/O 완료 포트의 핸들을 반환하며 새 I/O 완료 포트를 만들지 않습니다.
이 매개 변수가 NULL인 경우 함수는 새 I/O 완료 포트를 만들고 FileHandle 매개 변수가 유효하면 이를 새 I/O 완료 포트와 연결합니다. 그러지 않으면 파일 핸들 연결이 발생하지 않습니다. 함수는 성공하면 새 I/O 완료 포트에 대한 핸들을 반환합니다.
CompletionKey: 지정된 파일 핸들에 대한 모든 I/O 완료 패킷에 포함된 핸들당 사용자 정의 완료 키입니다.
아직 전혀 무슨 말인지 모르겠다.
NumberOfConcurrentThreads: 운영 체제에서 I/O 완료 포트에 대한 I/O 완료 패킷을 동시에 처리하도록 허용할 수 있는 최대 스레드 수입니다. 이 매개 변수는 ExistingCompletionPort 매개 변수가 NULL이 아닌 경우 무시됩니다. → iocp를 최초로 생성할 때에만 쓰이는 값. 후술할 add로 추가할 때에는 무시되는 값.