반응형
선입선출(FIFO, First In First Out) 구조
맨뒤에 데이터를 추가하고 맨 앞에서 데이터가 출력
큐가 비어 있을때 에러 System.InvalidOperationException: '큐가 비어 있습니다.'
일반 Queue
using System;
using System.Collections.Generic;
namespace ConsoleApp11
{
class Program
{
static void Main(string[] args)
{
Queue<int> numbers = new Queue<int>();
numbers.Enqueue(1); //큐에 데이터 추가
numbers.Enqueue(2);
numbers.Enqueue(3);
int iDequeue = 0 ;
iDequeue = numbers.Peek(); //큐의 데이터를 제거하기 않고 가져오기
Console.WriteLine(iDequeue);
iDequeue = numbers.Dequeue(); //큐의 데이터 반환
Console.WriteLine(iDequeue); //output 1
iDequeue = numbers.Dequeue(); //큐의 데이터 반환
Console.WriteLine(iDequeue); //output 2
iDequeue = numbers.Dequeue(); //큐의 데이터 반환
Console.WriteLine(iDequeue); //output 3
if(numbers.Count > 0) //큐에 남은 데이터 확인
{
iDequeue = numbers.Dequeue(); //큐의 데이터 반환
Console.WriteLine(iDequeue); //output
}
Console.ReadLine();
}
}
}
Thread-safe한 ConcurrentQueue
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp11
{
class Program
{
static void Main(string[] args)
{
// Thread-safe한 Wrapper 큐
ConcurrentQueue<int> numbers = new ConcurrentQueue<int>();
// 데이타를 큐에 넣는 쓰레드
Task tEnqueue = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 100; i++)
{
numbers.Enqueue(i);
Thread.Sleep(10);
}
});
// 데이타를 큐에서 읽는 쓰레드
Task tDequeue = Task.Factory.StartNew(() =>
{
int count = 0;
while (count < 100)
{
if (numbers.TryDequeue(out int result))
{
Console.WriteLine(result); // output : 0~99
count++;
}
Thread.Sleep(10);
}
});
// 두 쓰레드가 끝날 때까지 대기
Task.WaitAll(tEnqueue, tDequeue);
Console.ReadLine();
}
}
}
반응형
'C#' 카테고리의 다른 글
C# OpenFileDialog (파일 불러오기, 파일 열기) (0) | 2021.07.12 |
---|---|
C# enum 및 enum Array(배열) 변환 (0) | 2021.07.01 |
2021년 6월 29일 프로그래밍 언어 순위 및 비교 (0) | 2021.06.29 |
C# Thread (Process RealTime 및 우선순위) (0) | 2021.06.29 |
C# 구조체 형식 및 구조체 저장하기(Serializable) (0) | 2021.06.28 |