윈도우즈프로그래밍#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 비동기 코드
- 호출자와 비동기 메소드를 병렬로 실행하게 할 수 있음
- 비동기 스레드