반응형

비동기 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;
    }
    
}
 

cs



주석 친 설명과같이  

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

+ Recent posts