[C# 기초강의] Ch 19. 스레드와 태스크

728x90

 

https://www.youtube.com/watch?v=TY7qY01f1nI&list=PLVsNizTWUw7GN8wPRhclbKuQa9aI9Cj2V&index=20

 

📌 프로세스와 스레드

 

◾ 프로세스

  • 실행파일의 데이터와 코드가 메모리에 적재되어 동작하는 것
  • word.exe가 실행파일이라면, 이 실행 파일을 실행한 것이 프로세스

 

◾ 스레드

  • 스레드는 운영체제가 CPU 시간을 할당하는 기본 단위
  • 프로세스가 밧줄이라면 스레드는 밧줄을 이루는 실

 

◾ 멀티스레드

  • 한 프로세스 안에 2개 이상의 스레드를 실행
  • 장점 : 높은 경제성, 높은 사용자 응답성, 용이한 데이터 교환
  • 단점 : 높은 개발 난이도, 과다한 스레드는 성능 저하, 스레드의 문제는 프로세스로 확산

 

◾ 스레드 시작하기

  • System.Threading.Thread : 스레드를 나타내는 클래스
  • 스레드 기동 절차
  1. Thread 인스턴스 생성 (스레드가 실행할 메서드를 생성자 인수로 입력)
  2. Thread.Start() 메서드 호출(스레드 시작)
  3. Thread.Join() 메서드 호출 (스레드 종료 대기
static void DoSomething()

{

	for (int i=-; i<5; i++)
    {
    	Console.WriteLine("DoSomething : {0}", i);
    }
    
}

static void Main(stirng[] args)
{
	Thread t1 = new Thread (new ThreadStart(DoSomething));
    t1.Start();
    t1.Join();
}

 

◾ 스레드 멈추기 - Abort

  • 스레드는 실행중인 메서드가 종료되면 함께 종료됨
  • 필요 시 Abort()메서드 호출하여 강제종료
  • Abort() 메서드 호출 시 ThreadAbortedException 발생
static void DoSomething()

{
	try 
    {
        for (int i=-; i<5; i++)
        {
            Console.WriteLine("DoSomething : {0}", i);
        }
    } 
    catch ( ThreadAbortedException e)
    { ... }
    finally
    { ... }
}

static void Main(stirng[] args)
{
	Thread t1 = new Thread (new ThreadStart(DoSomething));
    t1.Start();
    t1.Abort();
    t1.Join();
}

 

◾ 스레드 멈추기 - Interrupt

  • 스레드가 WaitJoinSleep 상태에 진입했을 떄 ThreadInterruuptedException 예외를 일으켜 스레드를 중단시킴
  • 스레드가 블록 되어 있을 때 스레드를 중단시키므로 부작용을 최소하 할 수 있음
static void DoSomething()

{
	try 
    {
        for (int i=-; i<5; i++)
        {
            Console.WriteLine("DoSomething : {0}", i);
        }
    } 
    catch ( THreadInterruptedException e)
    { ... }
    finally
    { ... }
}

static void Main(stirng[] args)
{
	Thread t1 = new Thread (new ThreadStart(DoSomething));
    t1.Start();
    t1.Interrupt();
    t1.Join();
}

 

◾ 스레드의 상태 변화

  • Unstared : 스레드 생성 직후
  • Running : 실행 중
  • WaitSleepJoin : 블록된 상태
  • Suspend : 일시 중단 상태
  • Aborted : 취소 상태
  • Stopped : 정지 상태

 

◾ 스레드간의 동기화

  • 멀티스테드 동기화
    : 변수와 같은 자원을 한번에 한 스레드가 사용 할 수 있도록 순서를 맞추는 것
  • .NET이 제공하는 대표적 동기화 도구
  • lock 키워드
  • Monitor 클래스

 

◾ 크리티컬 섹션

  • 동시 접근이 불가능하도록 보호된 코드 영역
  • C#에서는 lock 키워드를 이용하여 생성 가능

 

◾ Monitor 클래스

  • 스레드 동기화를 지원하는 메서드 제공
  • Monitor.Enter()와 Monitor.Exit()를 이용하면 lock과 같이 크리티컬 섹션 생성 가능

 

◾ Monitor.Wait()과 Monitor.Pulse()

  • Monitor.Wait() 메서드 호출을 통해 스레드는 WaitSleepJoin 상태로 진입
  • WaitSleepJoin 상태의 스레드는 Waiting Queue 에 입력
  • Running 상태 스레드가 작업을 마친 뒤 Monitor.Pluse()메서드 호출
  • CLR은 Waiting Queue의 가장 첫 요소 스레드를 꺼내 Ready Queue에 입력
  • Ready Queue에 입력된 스레드는 lock을 획득하여 Running 상태에 진입

 

◾ Systme.Threading.Tasks.Task 클래스

  • Action 대리자 실행
  • Start() 메서드 : Action 대리자 비동기 실행
  • Factory.StartNew() 메서드 : Task 객체 생성 및 Action 대리자 비동기 실행
  • Wait() 메서드 : Action 대리자 실행 완료 대기

 

◾ Systme.Threading.Tasks.Task< TResult > 클래스

  • Func 대리자 실행
  • Start() 메서드 : Func 대리자 비동기 실행
  • Factory.StartNew() 메서드 : Task 객체 생성 및 Func 대리자 비동기 실행
  • Wait() 메서드 : Func 대리자 실행 완료 대기

 

◾ Parallel 클래스

  • 병렬 반복 코드를 지원
  • Parallel.For() / Parallel.ForEach() 메서드에 반복 범위와 Action 대리자 인수로 입력

 

◾ async와 await (1/2)

  • async 한정자
    메서드, 이벤트 처리기, 태스크, 람다식 등을 수식
    C#컴파일러가 async 한정자로 수식한 코드의 호출자를 만날 때 호출 결과를 기다리지 않고 바로 다음 코드로 이동하도록 실행 코드 생성
  • async로 한정하는 메서드는 반환 형식이 Task나 Task< TResult > 또는 void 여야 함
    실행하고 잊어버릴 작업을 담고 있는 메서드라면 반환형식을 void로 선언
    작업이 완료 될 때 까지 기다리는 메서드라면 Task, Task< TResult > 로 선언

 

◾ async와 await (2/2)

  • async로 한정한 Task또는 Task< TResult >를 반환하는 메서드/태스크/람다식은 await 연산자를 만나는 곳에서 호출자에게 제어 반환
  • await 연산자가 없는 경우 동기로 실행
728x90