|
DoyongID 님이 쓰신 글 :
: 채팅서버에서 총 100개의 접속을 받았다고 가정하고요..
:
: 10개의 방을 만들어서 10명씩 넣었습니다. 각 방에서 채팅을 하면 10명씩한테만 메시지가 날아가겠죠..
:
: 전송할 때는 LockList를 걸어서 하는걸로 아는데, 그러면 모든 소켓이 잠기게 되는것 아닌가요?
:
: 같은 방에 있는 10명한테만 보내면 되는데, 10개의 소켓에만 Lock해도 될 것 같은데..
:
: 그렇게 할 수 있는 방법이 있나요?
:
:
: 또 하나 궁금한게 있는데, Lock이 걸려있는 상태에서는 Send, Recv 둘 다 안되는겁니까? 뭐, 아예 작업이 원천적으로 차단되는건지요..
인디의 LockList는요 내부적으로 크리티컬 섹션 (임계영역)을 사용하여 락을 겁니다.
임계영역은 말그대로 어떠한 일정 영역을 락 거는건데요
그 영향을 받는 영역이 바로 TList이고, 프로퍼티로는 Threads라는 프로퍼티이죠
이 Threads의 인디에서의 역할은 바로 세션의 생성과 삭제에서 목록을 관리하는게 주역할 이구요
만약 Threads에 LockList로 락을 걸게 되면, 인디컴포넌트는 새로운 접속이 발생하였을 때
새로운 세션을 생성하여 Threads에 세션 오브젝트(TIdPeerThread 혹은 AThread)를 추가하게 되는데,
락이 걸린 상태이므로 세션의 추가가 락이 풀릴 때까지 지연이 되지요
이해 되시는지 모르겠네요 ^^
즉 소켓(혹은 세션오브젝트)하나 하나에 락을 거는게 아니므로 세션 오브젝트 하나의 인스턴스 접근에는 LockList의 영향을 받지 않습니다. 그러므로 모든 접근(읽기, 쓰기)이 가능해지죠
세션 오브젝트하나 하나 락을 거시려며 직접 하셔야 하는데 개인적으로 이러한 로직 프로그래밍은 비추천입니다. 서버에서 임계영역이 많아 질 수록 곧 그것은 비용으로 합산됩니다.
|