멀티태스킹(Multitasking)
C#에서 멀티스레드를 구현하는 방법을 설명하기 전에 멀티태스킹과 멀티스레딩 개념을 간단하게 알아봅시다. Windows와 Mac OS는 널리 사용되고 있는 멀티태스킹 운영체제입니다. 멀티태스킹 운영체제는 여러 애플리케이션을 동시에 실행할 수 있다는 의미입니다.
예를 들어 우리는 게임을 플레이하면서 유튜브 동영상을 볼 수 있고 코딩을 하면서 노래를 들을 수 있습니다. 이렇게 여러 작업이 가능한 이유는 사용하고 있는 컴퓨터의 운영체제가 멀티태스킹 운영체제이기 때문입니다.
멀티스레딩(Multithreading)
실행되고 있는 프로그램을 프로세스라고 말하며 프로세스를 여러 단위로 나눈 것을 스레드라고 말합니다. 멀티스레딩은 여러 스레드가 동시에 작업하는 것을 말하며, 동시 프로그램을 구현하기 위해 나타난 메커니즘입니다. 멀티스레딩을 구현하기 위해서는 멀티태스킹 운영체제가 필요하고 멀티스레딩을 통해 CPU 리소스를 효율적으로 사용할 수 있습니다.
싱글 스레드의 단점
다음 예제처럼 MethodExample1(), MethodExample2(), MethodExample3() 메서드는 Main() 메서드에서 호출됩니다. 코드는 순차적으로 처리되므로 MethodExample1() 메서드를 실행합니다. MethodExample1() 메서드의 실행이 완료되면 MethodExample2() 메서드를 호출합니다.
class Program
{
static void MethodExample1()
{
for(int loop = 0; loop < 3; loop++)
{
Console.WriteLine("MethodExample1()의 loop: " + loop);
}
}
static void MethodExample2()
{
for (int loop = 0; loop < 3; loop++)
{
Console.WriteLine("MethodExample2()의 loop: " + loop);
}
}
static void MethodExample3()
{
for (int loop = 0; loop < 3; loop++)
{
Console.WriteLine("MethodExample3()의 loop: " + loop);
}
}
static void Main(string[] args)
{
MethodExample1();
MethodExample2();
MethodExample3();
}
}
실행 결과
MethodExample1()의 loop: 0
MethodExample1()의 loop: 1
MethodExample1()의 loop: 2
MethodExample2()의 loop: 0
MethodExample2()의 loop: 1
MethodExample2()의 loop: 2
MethodExample3()의 loop: 0
MethodExample3()의 loop: 1
MethodExample3()의 loop: 2
MethodExample1() 메서드의 실행시간이 5초, MethodExample2() 메서드의 실행시간이 3초라고 가정합시다. 코드는 순차적으로 실행되므로 MethodExample3() 메서드는 8초 동안 대기해야 합니다.
다음 예제는 Thread 클래스의 Sleep() 메서드를 사용하여 MethodExample1() 메서드는 5초, MethodExample2() 메서드는 3초 후 반복문이 실행되도록 합니다.
class Program
{
static void MethodExample1()
{
Thread.Sleep(5000);
for(int loop = 0; loop < 3; loop++)
{
Console.WriteLine("MethodExample1()의 loop: " + loop);
}
}
static void MethodExample2()
{
Thread.Sleep(3000);
for (int loop = 0; loop < 3; loop++)
{
Console.WriteLine("MethodExample2()의 loop: " + loop);
}
}
static void MethodExample3()
{
for (int loop = 0; loop < 3; loop++)
{
Console.WriteLine("MethodExample3()의 loop: " + loop);
}
}
static void Main(string[] args)
{
MethodExample1();
MethodExample2();
MethodExample3();
}
}
멀티 스레드 예제
위 문제를 해결하기 위해 멀티스레딩 개념을 도입합니다. 다음 예제는 세 가지 Thread 객체를 사용하여 메서드를 동시에 실행되도록 합니다.
class Program
{
static void MethodExample1()
{
Thread.Sleep(5000);
for (int loop = 0; loop < 3; loop++)
{
Console.WriteLine("MethodExample1()의 loop: " + loop);
}
}
static void MethodExample2()
{
Thread.Sleep(3000);
for (int loop = 0; loop < 3; loop++)
{
Console.WriteLine("MethodExample2()의 loop: " + loop);
}
}
static void MethodExample3()
{
for (int loop = 0; loop < 3; loop++)
{
Console.WriteLine("MethodExample3()의 loop: " + loop);
}
}
static void Main(string[] args)
{
// 세 개의 Thread 객체
Thread t1 = new Thread(MethodExample1);
Thread t2 = new Thread(MethodExample2);
Thread t3 = new Thread(MethodExample3);
// 스레드 시작
t1.Start();
t2.Start();
t3.Start();
}
}
실행 결과
MethodExample3()의 loop: 0
MethodExample3()의 loop: 1
MethodExample3()의 loop: 2
MethodExample2()의 loop: 0
MethodExample2()의 loop: 1
MethodExample2()의 loop: 2
MethodExample1()의 loop: 0
MethodExample1()의 loop: 1
MethodExample1()의 loop: 2
세 개의 Thread 객체를 사용하여 세 가지 메서드를 실행합니다. Thread 객체에 전달된 메서드를 실행하기 위해 Start() 메서드를 호출합니다.
세 가지 메서드는 동시에 실행되었으며, MethodExample1() 메서드는 5초, MethodExample2() 메서드는 3초 후 반복문을 실행하므로 대기시간이 없는 MethodExample3() 메서드의 반복문이 먼저 실행되었습니다.
정리
- 멀티스레딩은 동시에 여러 스레드를 실행하는 방법입니다.
- 동시에 여러 스레드가 실행되므로 병렬 처리에 유용합니다.
- 멀티스레딩 메커니즘을 적용하면 코드가 동시에 실행되므로 실행 순서를 보장하지 않습니다.
'C#' 카테고리의 다른 글
[C#]스레드 동기화(Thread Synchronization) (0) | 2022.06.05 |
---|---|
[C#]지역 함수(Local Function) (0) | 2022.05.29 |
[C#]Thread 생성자(Thread Constructor) (0) | 2022.05.28 |
[C#]캡슐화(Encapsulation) (0) | 2022.05.25 |
[C#]확장 메서드(Extension Method) (0) | 2022.05.24 |
댓글