윈도우즈프로그래밍#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까지를 매개변수로 넘기면서 호출