네트워크

[C#] JobQueue

우대비 2022. 6. 20. 20:59
반응형

JobQueue는 하나의 Todo List정도로 생각하면 됨

lock을 이용하면 Thread가 하는일들이 겹칠일이 없음

 하지만 수십, 수백의 사람들이 통신을 하는 상황에서는 겹치지 않는다 하더라도 아래와 같은 문제가 생길 수 있음

 - lock이 풀릴때까지 대기 - 사용가능한 thread 없음 - thread 생성 - 반복

 이때 사용하는게 _jobQueue

public interface IJobQueue
{
    void Push(Action job);
}

 

public class JobQueue : IJobQueue
{
    Queue<Action> _jobQueue = new Queue<Action>();
    object _lock = new object();
    bool _flush = false;

 

    public void Push(Action job)
    {
        bool flush = false;

        lock (_lock)
        {
            _jobQueue.Enqueue(job);
            if (_flush == false)
                flush = _flush = true;
        }
        if (flush)
            Flush();
    }

Push로 들어온 수많은 Thread는 lock으로 들어가려함

가장 먼저 도착한 Thread가 먼저 들어가면 그 안에서 일을 처리하는게 아니라

_jobqueue에 일거리만 넣어두고 다른일을 하러감

대기하는 Thread가 쌓일수가 없게됨

 

    void Flush()
    {
        while (true)
        {
            Action action = Pop();
            if (action == null)
                return;

            action.Invoke();
        }
    }

 

    Action Pop()
    {
        lock (_lock)
        {
            if (_jobQueue.Count == 0)
            {
                _flush = false;
                return null;
            }
            return _jobQueue.Dequeue();
        }
    }
}

 

반응형
LIST

'네트워크' 카테고리의 다른 글

Google Protocol Buffers 설치  (0) 2022.07.19
[C#] TaskTimer  (0) 2022.06.21
[C#] 패킷 효율적으로 보내기  (0) 2022.06.21