다음을 통해 공유


동기 및 겹치는 파이프 I/O

ReadFile, WriteFile, TransactNamedPipeConnectNamedPipe 함수는 파이프에서 동기 또는 비동기식으로 입력 및 출력 작업을 수행할 수 있습니다. 함수가 동기적으로 실행되면 수행 중인 작업이 완료될 때까지 반환되지 않습니다. 즉, 시간이 많이 걸리는 작업이 완료될 때까지 기다리는 동안 호출 스레드의 실행을 무기한 차단할 수 있습니다. 함수가 비동기적으로 실행되면 작업이 완료되지 않은 경우에도 즉시 반환됩니다. 이렇게 하면 호출 스레드가 다른 작업을 자유롭게 수행할 수 있는 동안 백그라운드에서 시간이 많이 걸리는 작업을 실행할 수 있습니다.

비동기 I/O를 사용하면 파이프 서버에서 다음 단계를 수행하는 루프를 사용할 수 있습니다.

  1. 대기 함수 호출에서 여러 이벤트 개체를 지정하고, 개체 중 하나가 신호 상태로 설정될 때까지 기다립니다.
  2. 대기 함수의 반환 값을 사용하여 겹치는 작업이 완료되었는지 확인합니다.
  3. 완료된 작업을 클린 해당 파이프 핸들에 대한 다음 작업을 시작하는 데 필요한 작업을 수행합니다. 여기에는 동일한 파이프 핸들에 대해 겹치는 다른 작업을 시작하는 작업이 포함될 수 있습니다.

겹치는 연산을 사용하면 하나의 파이프가 동시에 데이터를 읽고 쓸 수 있고 단일 스레드가 여러 파이프 핸들에서 동시 I/O 작업을 수행할 수 있습니다. 이렇게 하면 단일 스레드 파이프 서버가 여러 파이프 클라이언트와의 통신을 효율적으로 처리할 수 있습니다. 예제는 겹치는 I/O를 사용하는 명명된 파이프 서버를 참조하세요.

파이프 서버가 동기 작업을 사용하여 둘 이상의 클라이언트와 통신하려면 다른 스레드가 대기하는 동안 하나 이상의 스레드를 실행할 수 있도록 각 파이프 클라이언트에 대해 별도의 스레드를 만들어야 합니다. 동기 작업을 사용하는 다중 스레드 파이프 서버의 예는 다중 스레드 파이프 서버를 참조하세요.

비동기 작업 사용

ReadFile, WriteFile, TransactNamedPipeConnectNamedPipe 함수는 지정된 파이프 핸들에 대해 겹치는 모드를 사용하도록 설정하고 OVERLAPPED 구조체에 유효한 포인터를 지정하는 경우에만 비동기적으로 수행할 수 있습니다. OVERLAPPED 포인터가 NULL이면 함수 반환 값이 작업이 완료되었음을 잘못 나타낼 수 있습니다. 따라서 FILE_FLAG_OVERLAPPED 사용하여 핸들을 만들고 비동기 동작을 원하는 경우 항상 유효한 OVERLAPPED 구조를 지정하는 것이 좋습니다.

지정된 OVERLAPPED 구조체의 hEvent 멤버는 수동 재설정 이벤트 개체에 대한 핸들을 포함해야 합니다. CreateEvent 함수에서 만든 동기화 개체입니다. 겹치는 작업을 시작하는 스레드는 이벤트 개체를 사용하여 작업이 완료된 시기를 결정합니다. 동일한 핸들에서 동시 작업을 수행할 때는 파이프 핸들을 동기화에 사용하면 안 됩니다. 파이프 핸들이 신호를 받은 작업의 완료를 알 수 있는 방법이 없기 때문입니다. 동일한 파이프 핸들에서 동시 작업을 수행하는 유일한 신뢰할 수 있는 기술은 각 작업에 대해 고유한 이벤트 개체와 함께 별도의 OVERLAPPED 구조를 사용하는 것입니다. 이벤트 개체에 대한 자세한 내용은 동기화를 참조 하세요.

또한 GetQueuedCompletionStatus 또는 GetQueuedCompletionStatusEx 함수를 사용하여 겹치는 작업이 완료되면 알림을 받을 수 있습니다. 이 경우 OVERLAPPED 구조에서 수동 재설정 이벤트를 할당할 필요가 없으며 비동기 읽기 또는 쓰기 작업과 동일한 방식으로 파이프 핸들에 대해 완료가 발생합니다. 자세한 내용은 I/O 완료 포트를 참조하세요.

ReadFile, WriteFile, TransactNamedPipeConnectNamedPipe 작업이 비동기적으로 수행되면 다음 중 하나가 발생합니다.

  • 함수가 반환할 때 작업이 완료되면 반환 값은 작업의 성공 또는 실패를 나타냅니다. 오류가 발생하면 반환 값은 0이고 GetLastError 함수는 ERROR_IO_PENDING 이외의 값을 반환합니다.
  • 함수가 반환할 때 작업이 완료되지 않은 경우 반환 값은 0이고 GetLastError 는 ERROR_IO_PENDING 반환합니다. 이 경우 호출 스레드는 작업이 완료될 때까지 기다려야 합니다. 그런 다음 호출 스레드는 GetOverlappedResult 함수를 호출하여 결과를 결정해야 합니다.

완료 루틴 사용

ReadFileExWriteFileEx 함수는 겹치는 다른 형태의 I/O를 제공합니다. 이벤트 개체를 사용하여 완성을 알리는 겹치는 ReadFileWriteFile 함수와 달리 확장 함수는 완료 루틴을 지정합니다. 완료 루틴은 읽기 또는 쓰기 작업이 완료될 때 실행을 위해 큐에 대기하는 함수입니다. ReadFileExWriteFileEx라는 스레드가 fAlertable 매개 변수가 TRUE로 설정된 경고 가능한 대기 함수 중 하나를 호출하여 경고 가능한 대기 작업을 시작할 때까지 완료 루틴이 실행되지 않습니다. 경고 대기 작업에서 함수는 ReadFileEx 또는 WriteFileEx 완료 루틴이 실행을 위해 큐에 대기할 때도 를 반환합니다. 파이프 서버는 확장 함수를 사용하여 연결된 각 클라이언트에 대해 일련의 읽기 및 쓰기 작업을 수행할 수 있습니다. 시퀀스의 각 읽기 또는 쓰기 작업은 완료 루틴을 지정하고 각 완료 루틴은 시퀀스의 다음 단계를 시작합니다. 예제는 완료 루틴을 사용하여 명명된 파이프 서버를 참조하세요.