윈도우즈프로그래밍#18
LeeMir, 27 May 2021
스레드와 태스크
프로세스와 스레드
- 프로세스는 실행 파일이 실행되어 메모리에 적재된 인스턴스
- 프로세스는 반드시 하나 이상의 스레드로 구성
- 메인 스레드 하나가 반드시 실행되며, 메인 스레드에서 필요시 추가적인 스레드 실행
- 멀티 스레딩의 장점
- 경제성(데이터 공유, 교환)이 높음
- 사용자 대화형 프로그램의 응답성을 높일 수 있음
- 멀티 프로세싱 방식에 비해 스레드 간 데이터 교환이 쉬움
- 멀티 스레딩의 단점
- 개발, 테스트, 디버깅이 까다로움
- 스레드가 CPU를 사용하기 위해서는 문맥교환이 일어나야하는데, 이 작업에 적잖은 비용이 소모됨
- 스레드의 개수를 CPU의 코어 개수와 맞추는 게 좋음
- 멀티 프로세스 기반의 소프트웨어는 여러 개의 자식 프로세스 중 하나에 문제가 생기면 그 자식 프로세스 하나가 죽는 것 이상으로는 영향이 확산되지 않음
- 그러나, 멀티 스레드 기반의 소프트웨어에서는 자식 스레드 중 하나에 문제가 생기면 다른 스레드에도 문제가 생길 수 있어 전체 프로세스가 영향을 받음
- 스레드를 멈추는 방법 : Abort(), Interrupt()
- Interrupt() 메소드는 스레드가 한참 동작중인 상태를 피해 WaitJoinSleep 상태에 들어갔을 때 예외를 던져 스레드를 종료시킴
- 스레드간의 동기화
Monitor.Wait()
와Monitor.Pulse()
로 하는 저수준 동기화- lock을 획득 후 wait()을 호출할 조건을 검사해 Monitor.Wait()을 호출하게 하거나, lock 블록 마지막에 Pulse() 메소드를 호출해 다른 스레드들을 깨우도록 함
Task와 Task<TResult>, 그리고 Parallel
- Task 클래스
- Task 클래스는 프로그래머가 비동기 코드를 손쉽게 작성할 수 있도록 도와줌
- Task<Tresult>로 선언할 경우 코드가 비동기로 실행한 후 TResult 형식의 결과를 반환하게 함
Parallel.For(0, 100, SomeMethod )
- SomeMethod()를 호출하는데 0에서 100까지를 매개변수로 넘기면서 호출