윈도우즈프로그래밍#13

LeeMir, 06 May 2021

고급 프로그래밍 기법(이어서)


스레드
  • 우리가 작성하는 프로그램은 기본적으로 순차 프로그램
    • 각 프로그램별로 시작, 순차적 실행 그리고 종료를 가짐
    • 프로그램의 실행 과정 중 오직 하나의 실행 점(execution point)을 갖고 있음
  • 스레드
    • 순차 프로그램과 유사하게 시작, 실행, 종료의 순서를 가짐
    • 실행되는 동안에 한 시점에서 단일 실행 점을 가짐
    • 프로그램 내에서만 실행 가능
      • 스레드는 프로그램 내부에 있는 제어의 단일 순차 흐름(single sequential flow of control)
      • 단일 스레드 개념은 순차 프로그램과 유사
  • 멀티스레드(multithread) 시스템
    • 스레드가 하나의 프로그램 내에 여러 개 존재
    • 공유 힙과 공유 데이터, 그리고 코드를 공유함으로써 문맥 전환시 적은 부담을 가짐
    • 한 개의 프로그램 내에서 동일 시점에 각각 다른 작업을 수행하는 여러 개의 스레드가 존재하므로 복잡한 문제들이 야기될 수 있음
    • 스레드가 늘어날 때마다 지역 변수를 선언할 스택과 상태 정보를 저장할 공간을 할당받음
  • C#에서는 언어 수준에서 스레드를 지원
    • 객체이며 스레드가 실행하는 단위는 메소드
    • 스레드 객체를 위해 Thread 클래스를 제공
    • 메소드 연결을 위해 ThreadStart 델리게이트를 제공(System.Threading)
  • 스레드 프로그래밍의 순서
    • 스레드 몸체에 해당하는 메소드를 작성
    • 작성된 메소드를 ThreadStart 델리게이트에 연결
    • 생성된 델리게이트를 이용하여 스레드 객체를 생성
    • 스레드의 실행을 시작(Start() 메소드를 호출)
  • 스레드의 상태도
    • 상태 : Unstarted, Running, Suspended, Stopped
    • 시작메소드 : Start()
    • 종료조건 : 메소드의 종료, Abort() 실행
  • 스레드의 스케줄링
    • 실행 가능한 상태에 있는 여러 스레드의 실행 순서를 제어
    • 스레드가 생성될 때 그 스레드를 만든 스레드의 우선순위가 상속되며 Thread.Priority 프로퍼티를 통해서 참조하거나 변경 가능
    • 계산만 하는 스레드는 우선순위가 낮고, I/O에 가까울수록 우선순위가 높음
  • 동기화
    • 비동기 스레드
      • 각각의 스레드는 그의 실행에 필요한 모든 자료와 메소드를 포함
      • 병행으로 실행 중인 다른 스레드의 상태 또는 행위에 관계되지 않는 자신만의 공간에서 실행
    • 동기 스레드
      • 동시에 실행되는 스레드들이 자료를 공유
      • 다른 스레드의 상태와 행위를 고려
      • 동기화 문제
    • lock 문
      • 동일한 객체에 대하여 여러 스레드의 중첩 실행을 방지
      • lock 문은 아토믹 루틴(atomic routine)이 되어 실행 순서를 제어
      • lock(object obj) 형태로 사용
    • Moniter 클래스
      • 임의의 객체에 대한 특정 작업을 동기화 하기 위해 사용
      • Monitor.Enter()와 Monitor.Exit() 사이에 실행되는 작업을 동기적으로 실행
    • Async, Await 비동기 코드
      • 호출자와 비동기 메소드를 병렬로 실행하게 할 수 있음