본문 바로가기

C#

C# 스레드 - 1

  • 모든 코드는 C# 10을 기준으로 작성돼 있습니다. 따라서 C# 9에 추가된 최상위문 형식에 따라 생략된 부분이 있습니다.
  1. 스레드(thread): 하나의 실행 흐름. 스레드끼리는 서로 독립적. 스레드는 격리된 환경인 하나의 프로세스에서 실행.
    • 단일 스레드 프로그램: 한 프로세스 안에 하나의 스레드
    • 다중 스레드 프로그램: 한 프로세스 안에 여러 스레드 실행. 동일 실행 환경에서 동일 메모리를 공유.
    • 공유 상태(shared state): 여러 스레드가 메모리를 공유하는 상태.
      (예: 한 스레드가 저장하면 다른 한 스레드가 표시)
  2. 스레드 생성하기: Thread, Start
    • System.Threading 사용
    • 단일 스레드 생성이 기본값(가비지 컬렉터 등을 제외하고)
    • 가장 간단한 스레드 생성자 예시
    • 멀티 코어에서는 실제로 병렬로 실행되나 단일 코어에서는 작업 시간을 조각 내 각 스레드에 할당.
    • 작업이 끝나면 스레드는 종료. 종료된 스레드는 다시 실행하지 못함.
    • 윈도우 스토어 앱 등에서는 사용 불가능. Task로만 생성 가능.
    Thread newThread = new (WriteX);    // delegate 하나를 받아 새로운 스레드 생성
    newThread.Start()            // WriteY() 실행
    
    // 주 스레드 작업
    for (int i = 0; i < 1000; i++) Console.Write("O");
    
    // 새로운 스레드가 하는 작업
    static void WriteX()
    { 
        for (int i = 0; i < 1000; i++) Console.Write("X"); 
    }
    
    /* 실행하면 스레드가 각각 병렬로 실행되면서 O와 X가 번갈아가면서 나온다.(실행할 때 마다 다름)
    출력 예시:
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXOOOOOOOOOOOOOOOOOXOXXXXXXXXXXXXXXXX
    XXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXXXOOOOOOOOOX
    XXXXXXXXXXXXXXXXOOOOOOXXXOOOOOOOOOOOOOOXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    ...
    */
  3. Thread 내 속성
    • IsAlive: 스레드 실행 여부 속성
    • Name: 스레드 별 이름 설정 혹은 확인. 최초 한 번만 설정 가능(변경 불가)
    • Thread.CurrentThread : 실행되고 있는 스레드를 반환하는 정적 속성
  4. Thread 내 메서드
    • Join: 스레드의 작업이 끝날 때까지 기다리도록 하는 메서드
    • 정적 메서드
      • Thread.Sleep: 실행되고 있는 현재 스레드를 멈추는 메서드. 멈출 때 즉시 다른 스레드에게 CPU를 넘겨줌.
      • Thread.Yield: Sleep과 멈추는 것은 같으나 같은 프로세서의 스레드에게만 양보함.