본문 바로가기
C# 공부

thread

by Dev_Hugh 2021. 8. 28.
728x90
반응형

Study about thread and task

  • 운영체제를 미리 배웠기에 대략 정리한것
  • 자세한건 운영체제 강의 복습(공부) 꼭 하기

process and thread

  • 프로세스는 실행 파일이 실행되어 메모리에 적재된 인스턴스로 하나 이상의 스레드로 구성된다.
  • 스레드는 운영체제가 CPU 시간을 할당하는 기본 단위

multi thread

  • 사용자 대화형 프로그램에서 응답성을 높임
  • 메모리 자원을 할당하는 비용 절감 (경제성)
  • 멀티 프로세스 방식에 비해 자원 공유가 쉬움
  • 구현하기 까다롭고 테스트가 쉽지 않음
  • 과다한 사용은 context switching이 빈번해 성능 저하를 야기
  • 자식 스레드의 문제가 생기면 전체 프로세스에 영향을 끼침
using System.Threading;
static void DoSomething()
{
    for(int i = 0; i<5; i++)
    {
        Console.WriteLine($"DoSomething : {0}", i);
        Thread.Sleep(10);
    }
}
static void Main(string[] args)
{
    Thread t1 = new Thread(new ThreadStart(DoSomething));
    Console.WriteLine("Starting thread..");
    t1.Start();
    // t1 스레드의 DoSomething() 실행되는 동시에 for문도 실행
    for(int i = 0; i<5; i++)
    {
        Console.WriteLine($"Main : {i}");
        Thread.Sleep(10);
    }
    Console.WriteLine("Waiting until thread stops..");
    t1.Join();
    Console.WriteLine("Finished");
}
  • t1.Start() 은 스레드 시작
  • t1.Join() 은 스레드의 종료 대기

thread 임의로 멈추는 방법

  1. ThreadState 알고있는 전제로 접근
  2. Abort() 메소드
  3. Interrupted() 메소드

thread 동기화 - lock 이용

  • 스레드들이 순서를 갖춰 자원을 사용하게 하는것
  • 자원을 한번에 하나의 스레드가 사용하도록 보장

Task

  • 멀티 코어 시대 고성능 소프트웨어 개발을 위해 병렬처리 기법과 비동기 처리기법이 필요
  • 동기코드는 메소드 호출 후 실행이 종료(반환) 되어 다음 메소드 호출
  • 비동기코드는 메소드 호출 후 종료를 기다리지 않고 다음 코드 실행
static void Main(string[] args)
{
    Action someAction = () =>
    {
        Thread.Sleep(1000);
        Console.WriteLine("Printed asynchronously");
    };
    Task myTask = new Task(someAction);
    myTask.Start(); // 1
    Console.WriteLine("Printed synchronously");
    myTask.Wait(); // 2

    var myTask = Task.Run( () =>
    {
        Thread.Sleep(1000); // 3
        Console.WriteLine("Printed asynchronously");
    });
    Console.WriteLine("Printed synchronously");
    myTask.Wait();
}
  • Task 클래스를 사용하여 인스턴스를 생성시 Action 대리자를 받아 비동기 구현
  • 1번에서 생성자에서 넘겨받은 무명 함수를 비동기로 호출한다.
  • 2번에서 myTask 비동기 호출이 완료될때까지 기다린다.
  • 3번에서 Task의 생성과 시작을 동시에하고 Task가 실행할 Action 대리자도 무명 함수로 바꿈
  • 비슷한 Task클래스도 찾아보기

Parallel class

  • 손 쉬운 병렬 처리를 가능하게 한다.

async 한정자

  • 메소드, 이벤트 처리기, 태스크 람다식 등을 수식 가능
  • 메소드나 태스크를 수식하기만 하면 비동기 코드 생성
  • 작업이 완료될 때까지 기다리는 메소드는 Task나 Task로 선언
  • 실행하고 잊어버를 (Shoot and Forget) 작업을 담고있는 메소드는 void로 선언await 연산자
  • async void 반환형식은 awiat 연산자가 없어도 비동기로 실행
  • async Task 또는 Task 반환 형식은 await가 기술된 곳에서 호출자에게 제어 반환, await이 없는 경우 동기로 실행
728x90
반응형

'C# 공부' 카테고리의 다른 글

[자료구조] 배열(Array)  (0) 2023.06.20
garbage_collection  (0) 2021.08.29
serializable  (0) 2021.08.26
reflection  (0) 2021.08.26
LINQ  (0) 2021.08.26