반응형
쓰레드(Thread)란 무엇인가
프로세스(Process)와 쓰레드(Thread)의 차이
프로세스와 쓰레드는 컴퓨터에서 동작하는 작업의 단위입니다.
각각의 작업은 독립적으로 실행되며, 다른 작업에 영향을 미치지 않습니다.
- 프로세스는 운영체제로부터 자원(메모리, 핸들 등)을 할당받으며, 쓰레드는 프로세스 내부에서 자원을 공유합니다.
- 각 프로세스는 독립된 주소 공간을 가지며, 서로의 메모리에 접근할 수 없습니다. 하지만 하나의 프로세스 내에서 여러 쓰레드가 동시에 실행될 경우, 서로의 메모리에 자유롭게 접근할 수 있습니다.
- 프로세스는 하나 이상의 쓰레드로 구성될 수 있습니다. 쓰레드는 하나 이상의 프로세스에 속해 있을 수 없습니다.
멀티 쓰레드(Multi-thread)와 단일 쓰레드(Single-thread)
멀티 쓰레드는 여러 개의 쓰레드가 동시에 실행되는 것을 말하며, 단일 쓰레드는 하나의 쓰레드만 실행되는 것을 말합니다.
단일 쓰레드의 경우 한 번에 하나의 작업만 처리할 수 있으므로, 작업 처리 시간이 오래 걸리거나 무거운 작업을 처리할 때는 전체 시스템 성능에 영향을 미칩니다. 반면 멀티 쓰레드는 여러 개의 쓰레드가 동시에 작업을 처리할 수 있으므로 전체적인 작업 처리 속도가 빨라집니다. 하지만 쓰레드 간의 동기화 및 추가적인 관리가 필요합니다.
쓰레드를 사용하는 이유
- 응답성 향상
- 자원 공유
- 병렬 처리
쓰레드 사용시 고려해야할 사항
- 동기화(Synchronization)
- 경쟁 조건(Race Condition)
- 교착 상태(Deadlock)
C#에서 쓰레드 사용하기
쓰레드 생성 및 실행
class ThreadTest
{
static void Main()
{
Thread t = new Thread (WriteY); // Kick off a new thread
t.Start(); // running WriteY()
// Simultaneously, do something on the main thread.
for (int i = 0; i < 1000; i++) Console.Write ("x");
}
static void WriteY()
{
for (int i = 0; i < 1000; i++) Console.Write ("y");
}
}
쓰레드 정지 및 일시정지
Thread.Join 해당 쓰레드가 끝날 때까지 다른 쓰레드를 대기시킵니다.
static void Main()
{
Thread t = new Thread (Go);
t.Start();
t.Join();
Console.WriteLine("Thread t has ended!");
}
static void Go()
{
for (int i = 0; i < 1000; i++) Console.Write ("y");
}
Thread.Sleep 현재 쓰레드를 특정한 시간만큼 일시정지시킵니다.
Thread.Sleep(TimeSpan.FromHours (1)); // sleep for 1 hour
Thread.Sleep(500); // sleep for 500 milliseconds
Join과 Sleep 메서드는 쓰레드를 블럭시키므로 해당 시간동안 블럭된 쓰레드는 CPU 자원을 소모하지 않습니다.
쓰레드 강제종료
static void Main()
{
Thread t = new Thread(DoWork);
t.Start();
Thread.Sleep(5000); // 5초 대기
if (t.IsAlive)
{
Console.WriteLine("강제 종료");
t.Abort(); // 쓰레드 강제 종료
}
else
{
Console.WriteLine("정상 종료");
}
}
static void DoWork()
{
try
{
while (true)
{
Console.WriteLine("쓰레드 실행 중...");
Thread.Sleep(1000); // 1초 대기
}
}
catch (ThreadAbortException ex)
{
Console.WriteLine("쓰레드 종료 예외 발생");
Console.WriteLine(ex.Message);
}
}
Thread.Abort() 메서드를 사용하면 해당 쓰레드를 강제종료 시킬 수 있습니다.
쓰레드 우선순위
static void Main(string[] args)
{
// 스레드 생성 및 우선순위 설정
Thread thread1 = new Thread(new ThreadStart(Worker));
thread1.Name = "Thread 1";
thread1.Priority = ThreadPriority.Highest;
Thread thread2 = new Thread(new ThreadStart(Worker));
thread2.Name = "Thread 2";
thread2.Priority = ThreadPriority.Lowest;
// 스레드 시작
thread1.Start();
thread2.Start();
// 메인 스레드가 먼저 종료되지 않도록 스레드가 종료될 때까지 대기
thread1.Join();
thread2.Join();
Console.WriteLine("All threads finished.");
}
static void Worker()
{
Console.WriteLine("Thread {0} started.", Thread.CurrentThread.Name);
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Thread {0} is working.", Thread.CurrentThread.Name);
Thread.Sleep(500);
}
Console.WriteLine("Thread {0} finished.", Thread.CurrentThread.Name);
}
'프로그래밍 > C#' 카테고리의 다른 글
C# 미리 정의된 Delegate에 대해서 (18) | 2023.04.26 |
---|---|
인물 탐구 - C#의 아버지 아네르스 하일스베르(Anders Hejlsberg) (14) | 2023.04.24 |
C# is, as, typeof(), GetType() Type-testing 연산자에 대해서 (8) | 2023.04.12 |
C# 이벤트(Event)에 대해서 알아보자 (4) | 2023.04.05 |
C# Ref 와 Out 키워드 차이점에 대해서 (0) | 2023.04.04 |
댓글