C#/C#기초

17.스레드와 테스크

공부를하자 2023. 6. 10. 19:48

1.프로세스와 스레드

  1)프로세스(Process)

    -실행파일이 실행되어 메모리에 적재된 인스턴스

   2)스레드(Thread)

    -운영체제가 CPU 시간을 할당하는 기본단위

 2.멀티스레드

   1)정의 : 프로세스 안에 두가지 스레드를 실행하는 기법

   2)장점

     -응답성을 높일 있다.

     -자원의 공유가 쉽다.

     -경제적이다.

    3)단점

      -구현이 어렵다.(개발 난이도가 높다)

      -소프트웨어의 안정성을 해칠 있다.

      -과용하면 성능이 저하될 있다.

 3.스레드 시작하기

   -스레드를 제어하는 System.Threading.Thread 클래스를 사용

   -기동절차

 

 

 

4.스레드 종료 시키기

 1)Thread 객체의 Abort()메소드를 사용

 

*읽어보기

2)Thread 객체의 Interrupt()메소드 사용

-스레드가 동작중인(Running) 피해서 WaitSleepJoin 상태에 들어갔을때

 ThreadInterruptedException 예외를 던져 스레드를 중지시킨다.

 

5.스레드상태(ThreadState) 변화 관계

 

*Flags  애트리뷰트

 -ThreadState 가지고 있는 애트리뷰트

 -Enum 요소에 비트단위에 하나씩 저장하여 사용하는

 -스레드는 두가지 이상의 상태일 있다.

 -Flags 애트리뷰트는 스레드의 두가지 이상의 상태를 표현하기 위해 사용

 

 -스레드의 필드 값을 확인하는 예제

 

6.스레드 간의 동기화

  1)정의: 스레드 간의 순서를 갖춰 사용하는 .

            또는 자원을 번에 스레드가 사용하도록 순서를 맞추는 .

   C#에서는 lock 키워드 또는 Monitor 클래스의 동기화 도구가 있다.

 

 

  2)lock : 크리티컬 섹션을 활용할 있는 도구

  *크리티컬 섹션: 동시접근 불가능하게 보호된 구역

 

  *주의점

  스레드 객체들이 lock 키워드가 만나 연속해서 크리티컬 섹션이 생성되는 것은

  성능하락을 야기한다.  필요한 상황에서만 사용하자.

 

 -this 키워드와 함께 사용하지 않기

  :클래스의 인스턴스가 내부가 아닌 외부에서 사용될 경우 문제가 생길 수있다.

   lock(this) x

 -Type 형식:

 typeof 연산자나 object클래스를 물려받는 GetType()메소드는  Type형태의

 인스턴스를 반환 한다.

  lock(typeof(클래스))  lock(obj.GetType()) 피하기

-string  형식 :

String 객체를 락을 걸지 않는다. String("문자") 어떤 코드는 불러올 있는 형식이다.

 

 

 3)Monitor 클래스 : 스레드를 동기화를 지원하는 클래스

 - Monitor.Enter(): 크리티컬 섹션에 시작한다.

 - Monitor.Exit(): 크리티컬 섹션을 종료한다.

   Monitor.Enter() Monitor.Exit() 이용하면 lock 같이 크리티컬섹션을 생성

   -Monitor.Wait() Monitor.Pulse() 저수준 동기화

     Monitor.Wait():  스레드 상태를 WaitSleepJoin상태로 만든다.

     Monitor.Pulse():  스레드 상태를  WaitSleepJoin상태에서 벗어난다.

 

    *lock 블록안에서 구현하지 않으면 예외가 발생한다.

      -사용절차

 

 

 

7.System.Threading.Tasks.Task

  1)정의 : 비동기 코드를 작성하기 쉽게 해주는 클래스

   -Action 대리자를 실행

   -Start()메소드로 Action 대리자 비동기 실행

   -Run(): Task 생성을 시작을 단번에 실행

   -Factory.StartNew() Task 객체를 생성 Action 대리자 비동기 실행

   -Wait() 메소드: Action 대리자 실행완료 대기

 

    -Task<TResult> 비동기 작업의 결과를 원하는 타입으로 반환 받을 있다.

 

 

8.Parallel 클래스

 1)정의 : 병렬 반복코드를 지원하는 클래스

 2)Parallel.For(),Parallel .Foreach() 메소드에 반복범위와 Action 대리자를 인수로 입력

    -IsPrime(long number) 입력받는 인수가 소수인지 핀별

    -int from to 사이를 병렬처리한다.

    - 멀티 스레드 간에 total객체를 공유한다면 락을 걸어준다.

 

 

9. async await

 비동기 코드 작성을 쉽게 작성해주는 키워드

 

 1)async 한정자

   -async 한정자는 메소드,이벤트처리기,태스크,람다식을 수식한다.

   -C#컴파일러가 async한정자로 수식한 코드의 호출자를 만나면 호출 결과를 기다리지 않고

     다음 코드로 이동하도록 한다.

    -async 한정하는 메소드는 반환형식이 Task Task<TResult> 또는 void이여야한다.

    -실행 결과가 없거나 재사용이 되지 않는 작업이면 void 작업이 완료될때까지 기다리면  Task      

     Task<TResult> 한다.

  2)awiat

   -async 한정한 Task Task<TResult> 반환하는 메소드/테스크/람다식은 await 연산자를

    만나는 곳에서 호출자에게 제어를 반환한다.

   -await 연산자가 없으면 동기로 실행

  3)선언

 

 a b 동시 실행된다.

   *읽어보기

 

 

 

'C# > C#기초' 카테고리의 다른 글

18.네트워크 프로그래밍  (0) 2023.06.14
16.파일 다루기  (0) 2023.06.08
15.dynamic형식  (0) 2023.06.03
14.리플렉션과 애트리뷰트  (0) 2023.05.31
13.Linq  (0) 2023.05.24