서버를 개발하던 중 갑자기 kernalbase.dll에서 애러가 떴다.
필자는 분명 커널에서 애러가 났고, 커널이 관리하는 IOCP에서 비동기 Accept동작을 걸었으니 여기서 애러가 난 것이라 생각했다.
하지만 이것은 반은 맞았고 반은 틀린 생각이였다.
놀랍게도 애러는 바로 getchar에서 일어난 것이였다.
비동기 작업을 걸기 전 io처리 스레드(GQSC; GetQueuedCompletionStatus()가 있는 스레드)가 커널모드에서 활성화 되지 않은 상태에서 주 스레드가 terminated되었을 땐 문제가 발생하지 않았다.
문제가 발생하는 상황은 비동기 작업을 걸어 io처리 스레드가 활성화 되고, 아무 문자를 입력해 main스레드에서 getchar를 실행하게 되었다. 하지만 getchar는 thread-safe하지 않기 때문에 애러가 나는 것이다.
getchar말고도 C표준 스트림 입출력 함수들을 사용해도 애러가 날 수 있다.
해결책으로는 linux에서는 XXX_unlocked를 사용하고 windows에선 _XXX_nolock을 사용하면 된다.
스레드를 블로킹하기 위함이라면 system("pause > nul")을 사용해보자!
'C++ > 트러블슈팅' 카테고리의 다른 글
[C++] 메모리 풀에서 new 무한 호출 (0) | 2024.05.03 |
---|