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