-
알아두면 좋을 개념개발/C·C++ 2022. 1. 3. 21:49
IOCP를 이용한 멀티스레드 네트워크 프로그래밍에서 WSASend가 쉽지 않으며 버퍼 관리도 마찬가지입니다. 환형 버퍼를 사용하는 방법이 있으며 다른 방법은 메모리 풀링을 활용하는 것입니다.
1. 전역 버퍼 매니저를 통해 필요할 때마다 메모리를 할당받고 이 메모리는 쓰임이 다 끝나면(ref_count가 0이 되면) 자동으로 재활용됩니다. make_shared 객체를 만들 때 두 번째 인수로 deleter를 넣을 수 있는데 멤버 함수가 아닌 클래스 스태틱 함수를 넣어주면 됩니다. 반납할 때 매니저 클래스에서 관리하는 벡터 객체에 push_back 해줍니다.
2. 메모리 덩어리는 TLS에서 관리되도록 합니다. 그러면 획득한 메모리에 대해서는 멀티스레드를 신경쓰지 않아도 됩니다. 전역 객체인 버퍼 매니저에서 메모리를 얻을 때만 락을 걸면 됩니다. 능력이 된다면 락프리로 해도 될 겁니다. 획득된 메모리는 1번에서 언급한 버퍼 매니저가 가지고 있는 백터 객체에서 pop하거나 새로 할당해주는 것입니다. 새로 할당하든 백터에서 pop을 하든 쓰임이 다하면(ref_count가 0이 되면) 매니저의 백터 객체로 push_back 됩니다)
'개발 > C·C++' 카테고리의 다른 글
객체 생성 시 const의 위치 차이 (0) 2022.01.04 get 함수를 const로 해야 하는 이유 (0) 2022.01.04 복사 생성자와 이동 생성자 (0) 2021.12.27 객체 생성 시 함수 호출 순서 (0) 2021.12.27 바이트 정렬 (0) 2021.09.24