반응형
비동기 Socket 사용시 (BeginConnect, EndConnect, BegineSend, EndSend, BeginReceive, EndReceive 매서드 사용시)
socket은 thread를 사용하기에 Receive로 받은 데이터(byte[]) 을 접근할때 유의해야한다.
간혹 동시에 mainThread (응용계층)에서 Receive데이터를 접근시 비동기 socket thread 에서 도 Receive데이터를 접근할수 있다.
위문제가 발생하면 Receive데이터 값을 처리하는데에 문제가 생길수 있다.
아래 lock문 예시로 동기화 처리를 하도록 하자.
lock정의
- lock은 thread-unsafe(안전하지 않은 스레드)코드를 안전하게 사용하고자 할때 사용한다. 즉, 동기화 처리를 할때 사용하는 구문이다.
lock 사용법은 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Program { static object x = new object(); static void AnotherMethod() { lock (x) { Console.WriteLine("Another method"); } } static void Main() { lock (x) { AnotherMethod(); } Console.Read(); } } } | cs |
필자는 비동기 socket 사용시 lock사용할떄 아래와같이 receive데이터를 접근하엿다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public class SocketAsyncPool { private Queue<ByteData> m_DataPool; public SocketAsyncPool() { m_DataPool = new Queue<ByteData>(); } //들어온 receive데이터를 queue에 담는다. public void AddData(ByteData _addData) { //이떄 lock 잠궈서 Enqueue한다. lock (m_DataPool) m_DataPool.Enqueue(_addData); } // mainThread에서 저장된 receive데이터를 사용할떄 public ByteData GetData() { //이떄 lock 잠궈서 Dequeue한다. lock (m_DataPool) return m_DataPool.Dequeue(); } public bool ChkDataPool() { lock (m_DataPool) return m_DataPool.Count > 0 ? true : false; } } |
주석 친 설명과같이
lock (m_DataPool)
Lock 문 안에 처리를 하게되면 socket thread가 m_DataPool를 건들고 있을떄 mainThread는 m_DataPool 건들지 못하고 기다리게 된다.
반응형
'유니티 > 소켓 프로그래밍' 카테고리의 다른 글
[Socket] 소켓클라이언트 구현 (0) | 2018.12.18 |
---|---|
[Socket] 소켓 메서드관련 설명 (0) | 2018.12.14 |
[Socket] 소켓이란? (0) | 2018.12.14 |