반응형
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 |