Threaded Chat Server

스레드 채팅 서버는 공유 목록을 짧게 잠그고 전송은 밖에서 한다

각 클라이언트는 별도 스레드가 처리하지만, clients 목록은 공유 자원이다. 락은 목록 갱신과 스냅샷에만 짧게 쓰는 편이 안전하다.

접속 시 clients에 추가하고 종료 시 반드시 제거한다.
broadcast는 대상 목록을 복사한 뒤 각 소켓에 length-prefix 메시지를 보낸다.
스레드 1개당 연결 1개 모델은 단순하지만 대규모 연결에는 한계가 있다.
A
Client A thread recv_msg로 길이와 payload를 읽는다.
message"hi"
Shared clients list lock으로 보호하는 구간 목록 변경과 대상 스냅샷만 짧게 잠근다.
client Asender
client Btarget
client Ctarget
B/C
Broadcast targets send_msg가 4바이트 길이와 payload를 함께 보낸다.
0002 + hisendall
동기화 락 범위 최소화 락을 잡은 채 느린 네트워크 I/O를 오래 하지 않는다.
정리 finally에서 제거 예외와 정상 종료 모두 clients에서 빠지게 한다.
확장성 1,000명 = 1,000 스레드 다음 단계에서는 I/O 멀티플렉싱이나 async 모델을 고려한다.