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 |