프로세스에서는 한개 이상의 스레드(Thread)를 가지며 실행되는데,
스레드를 이용하면 한 프로세스에서 동시에 실행하며 처리해준다. 간단하게 예시로 알아보자.
1. Thread.Start(); : 스레드 시작
2. Thread.Sleep(); : 스레드 딜레이
스레드 [Thread]
스레드 적용전
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace _149_NeedThread
{
internal class Program
{
static void Main(string[] args)
{
for(int i = 0; i<10; i++)
{
Console.WriteLine($"카페에서 책을 읽는다{i}");
Thread.Sleep(100);
}
for(int i = 0; i<10;i++)
{
Console.WriteLine($"카페에서 음악을 듣는다{i}");
Thread.Sleep(100);
}
}
}
}
실행해보면 책을 다 읽고 난 후, 음악을 듣게된다.
스레드를 이용하면 책을 읽는 함수를 실행시키면서 동시에 음악을 듣는 함수를 실행시킬 수 있다.
스레드 적용 후 (메인함수)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace _150_NoParamThread
{
internal class Program
{
// 새로 배정할 스레드가 동작시키는 함수
static void ThreadMusic()
{
for(int i = 0; i < 10; i++)
{
Console.WriteLine($"카페에서 음악을 듣는다{i}");
Thread.Sleep(200);
}
Console.WriteLine("자식 스레드 종료");
}
// Main 함수에는 Main 스레드가 자동으로 닷넷에 의해 배정된다/.
static void Main(string[] args)
{
// 스레드를 생성시키는 객체
Thread t = new Thread(ThreadMusic);
t.Start(); // 스레드 동작 시작
for(int i = 0; i<10; i++)
{
Console.WriteLine($"카페에서 책을읽는다{i}");
Thread.Sleep(200);
}
Console.WriteLine("Main 스레드 종료");
}
}
}
ThreadMusic의 t라는 새로운 스레드 객체를 생성한다.
Thread.Start();는 스레드를 실행하는 함수이다.
Thread t = new Thread(ThreadMusic);
t.Start(); // 스레드 동작 시작
Thread.Sleep();을 이용하면 스레드의 실행 간격에 딜레이를 줄 수 있다.
Thread.Sleep(200);
하지만 실행 결과를 비교해보면 0.2초라는 딜레이를 주었음에도 실행결과가 다르다.
그렇다는것은 만약 어떤 변수를 +1씩 count하는 스레드와 -1씩 count하는 스레드가 동시에 실행될 때 값이 매번 다를 것이다. 이를 방지하기위해 동기화라는 것이 있는데, 나중에 lock이라는 동기화를 하는 방법을 이용하여 다시 보도록 하겠다.