2014-08-30 5 views
0

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로 설정되어 있지만 성공 및 오류가 아닌 다시 적용되며 취소에 영향을주지 않습니다)?

답변

3

CancelIoEx이 동기화 또는 비동기인지 여부는 I/O 자체 (예 : ReadFile)가 동기화 또는 비동기인지 여부를 나타냅니다. 그것은 동기화와 비동기 작업 간의 동작 차이를 설명합니다. 파일 핸들이 완료 포트에 연결되어있는 경우 동기 작업이 성공적으로 취소되면

,의 I/O를 완료 패킷은 포트에 대기되지 않습니다. 의 비동기 작업의 경우, 취소 작업은 I/O 완료 패킷을 대기열에 넣습니다. 즉시 완료 할 것 인 OVERLAPPED 구조가없는 사람, 또는 사람 - -

동기화 작전 오류 ERROR_OPERATION_ABORTED로 돌아갑니다.

비동기 작업 - 즉시 완료 할 수없는 OVERLAPPED 구조의 작업은 완료 알림이 ERROR_OPERATION_ABORTED으로 대기열에 포함됩니다.

+0

ReadFile()은 오버랩 구조로 제공되지만 즉시 완료됩니다. FILE_SKIP_COMPLETION_PORT_ON_SUCCESS가 설정되어 있지 않기 때문에 성공시 완료 패킷이 필요하고 GetXueuedCompletionStatusEx()에서 루핑하는 작업자 스레드의 대/소문자를 처리하기 위해 GetLastError()를 수동으로 저장하고 패킷을 게시 할 때 오류가 발생합니다. 그렇다면 내가 op 또는 반환 된 대기열에서 ERROR_OPERATION_ABORTED를 반환한다고 생각할 필요가 없다는 것을주의해야한다. 감사합니다 –

+0

당신이 그것을 가정하는 것은 정말로 안전합니다. –

관련 문제