IOCP 기반 네트워킹 구성 요소에 async-async-operation timeouts를 추가하므로 Java의 NIO.2 사용과 비슷한 C++ 인터페이스를 사용할 수 있습니다. 랜덤 액세스 제거를 지원하는 우선 순위 큐의 우선 순위 큐를 구현했습니다 (작업이 성공적으로 완료되면 관련 타임 아웃을 제거 할 수 있도록).CancelIoEx가 동 기적으로 취소되었는지 확인
제 질문은 어떻게 시간 초과가 발생했는지 처리하는 것입니다. 지금은 지정된 시간 초과에 해당하는 overlapped 구조체로 CancelIoEx를 호출합니다. 하지만, 난 그냥 MSDN에이 읽은 :
파일 핸들이 완료 포트와 연결된 경우, I/동기 작업 이 성공적으로 취소되면 O 완료 패킷이 포트에 대기되지 않습니다. 아직 보류중인 비동기 작업의 경우, 취소 작업은 I/O 완료 패킷을 대기열에 넣습니다.
나는 실행되는 (읽기/에러 코드를 가지고 표준 : 기능을 제공 조작 사용자 당 및 서면 바이트) 완료 핸들러로 확장 중첩 된 구조를 사용하여 완료 패킷은 다시 거의 자바의 NIO.2처럼 (대기열에서 제거 될 때마다 API). 취소가 비동기 적으로 발생하면 완료 핸들러가 평소와 같이 실행되고 ERROR_OPERATION_ABORTED가 표시됩니다. 하지만 CancelIoEx가 즉시 작업 취소에 성공한다면 어떻게 될까요? 위의 인용문에 따르면, 나중에 완료 패킷을받지 않으므로 그 시점에서 처리기를 실행해야합니다. 하지만 완료 패킷이 대기 상태에 있었거나 작업이 즉시 취소되었는지 여부를 어떻게 알 수 있습니까? 다른 비동기 작업과 달리 CancelIoEx는 동기 및 비동기 작업 완료 (이 경우 취소)를 구분하는 ERROR_IO_PENDING을 생성하지 않습니다. 또는, 내가 잘못 읽고 어떤 중복 된 작업이 비동기로 간주됩니다 (참고 : 이 아닌은 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS로 설정되어 있지만 성공 및 오류가 아닌 다시 적용되며 취소에 영향을주지 않습니다)?
ReadFile()은 오버랩 구조로 제공되지만 즉시 완료됩니다. FILE_SKIP_COMPLETION_PORT_ON_SUCCESS가 설정되어 있지 않기 때문에 성공시 완료 패킷이 필요하고 GetXueuedCompletionStatusEx()에서 루핑하는 작업자 스레드의 대/소문자를 처리하기 위해 GetLastError()를 수동으로 저장하고 패킷을 게시 할 때 오류가 발생합니다. 그렇다면 내가 op 또는 반환 된 대기열에서 ERROR_OPERATION_ABORTED를 반환한다고 생각할 필요가 없다는 것을주의해야한다. 감사합니다 –
당신이 그것을 가정하는 것은 정말로 안전합니다. –