종료 처리 중첩 방지를 위한 참조 카운팅 수필

어떤 소켓에 WSARecv와 WSASend 연산이 동시에 걸려 있을 경우, GetQueuedCompletionStatus 함수를 통해 2번의 리턴이 예약되어 있는 셈이다. 그런데 우선 리턴된 연산이 종료 상태를 가르킨다 하여 바로 종료 처리를 하게 되면 위험할 수 있다.(하지만 구조에 따라선 종료 처리가 2번 되어도 문제 없을 수도 있다. 그래도 연산의 중복이라는 측면에 깔끔하지 않음으로 정리하는 것이 나을 것이다.)

Accept 이후의 과정에서 WSARecv나 WSASend 함수를 성공적으로 호출했을시 참조값을 올려주고, GetQueuedCompletionStatus 함수에서 리턴되는 순간에 참조값을 감소 시키면 될 것 같다. 또한 close 처리 여부를 기록하여, 참조 카운트가 0일때 close 처리를 하는 부분에서 참고하고 이 부분은 크리티컬 섹션 블럭으로 동시 접근을 차단하는 구조여야 할 것 같다.

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://grayowl.egloos.com/tb/1736079 [도움말]

덧글

  • monsa 2008/06/03 21:44 # 답글

    criticalsection 보다는 interlockedincrement 가 더 좋습니다.
덧글 입력 영역