728x90
https://www.youtube.com/watch?v=TY7qY01f1nI&list=PLVsNizTWUw7GN8wPRhclbKuQa9aI9Cj2V&index=20
📌 프로세스와 스레드
◾ 프로세스
- 실행파일의 데이터와 코드가 메모리에 적재되어 동작하는 것
- word.exe가 실행파일이라면, 이 실행 파일을 실행한 것이 프로세스
◾ 스레드
- 스레드는 운영체제가 CPU 시간을 할당하는 기본 단위
- 프로세스가 밧줄이라면 스레드는 밧줄을 이루는 실
◾ 멀티스레드
- 한 프로세스 안에 2개 이상의 스레드를 실행
- 장점 : 높은 경제성, 높은 사용자 응답성, 용이한 데이터 교환
- 단점 : 높은 개발 난이도, 과다한 스레드는 성능 저하, 스레드의 문제는 프로세스로 확산
◾ 스레드 시작하기
- System.Threading.Thread : 스레드를 나타내는 클래스
- 스레드 기동 절차
- Thread 인스턴스 생성 (스레드가 실행할 메서드를 생성자 인수로 입력)
- Thread.Start() 메서드 호출(스레드 시작)
- Thread.Join() 메서드 호출 (스레드 종료 대기
static void DoSomething()
{
for (int i=-; i<5; i++)
{
Console.WriteLine("DoSomething : {0}", i);
}
}
static void Main(stirng[] args)
{
Thread t1 = new Thread (new ThreadStart(DoSomething));
t1.Start();
t1.Join();
}
◾ 스레드 멈추기 - Abort
- 스레드는 실행중인 메서드가 종료되면 함께 종료됨
- 필요 시 Abort()메서드 호출하여 강제종료
- Abort() 메서드 호출 시 ThreadAbortedException 발생
static void DoSomething()
{
try
{
for (int i=-; i<5; i++)
{
Console.WriteLine("DoSomething : {0}", i);
}
}
catch ( ThreadAbortedException e)
{ ... }
finally
{ ... }
}
static void Main(stirng[] args)
{
Thread t1 = new Thread (new ThreadStart(DoSomething));
t1.Start();
t1.Abort();
t1.Join();
}
◾ 스레드 멈추기 - Interrupt
- 스레드가 WaitJoinSleep 상태에 진입했을 떄 ThreadInterruuptedException 예외를 일으켜 스레드를 중단시킴
- 스레드가 블록 되어 있을 때 스레드를 중단시키므로 부작용을 최소하 할 수 있음
static void DoSomething()
{
try
{
for (int i=-; i<5; i++)
{
Console.WriteLine("DoSomething : {0}", i);
}
}
catch ( THreadInterruptedException e)
{ ... }
finally
{ ... }
}
static void Main(stirng[] args)
{
Thread t1 = new Thread (new ThreadStart(DoSomething));
t1.Start();
t1.Interrupt();
t1.Join();
}
◾ 스레드의 상태 변화
- Unstared : 스레드 생성 직후
- Running : 실행 중
- WaitSleepJoin : 블록된 상태
- Suspend : 일시 중단 상태
- Aborted : 취소 상태
- Stopped : 정지 상태
◾ 스레드간의 동기화
- 멀티스테드 동기화
: 변수와 같은 자원을 한번에 한 스레드가 사용 할 수 있도록 순서를 맞추는 것 - .NET이 제공하는 대표적 동기화 도구
- lock 키워드
- Monitor 클래스
◾ 크리티컬 섹션
- 동시 접근이 불가능하도록 보호된 코드 영역
- C#에서는 lock 키워드를 이용하여 생성 가능
◾ Monitor 클래스
- 스레드 동기화를 지원하는 메서드 제공
- Monitor.Enter()와 Monitor.Exit()를 이용하면 lock과 같이 크리티컬 섹션 생성 가능
◾ Monitor.Wait()과 Monitor.Pulse()
- Monitor.Wait() 메서드 호출을 통해 스레드는 WaitSleepJoin 상태로 진입
- WaitSleepJoin 상태의 스레드는 Waiting Queue 에 입력
- Running 상태 스레드가 작업을 마친 뒤 Monitor.Pluse()메서드 호출
- CLR은 Waiting Queue의 가장 첫 요소 스레드를 꺼내 Ready Queue에 입력
- Ready Queue에 입력된 스레드는 lock을 획득하여 Running 상태에 진입
◾ Systme.Threading.Tasks.Task 클래스
- Action 대리자 실행
- Start() 메서드 : Action 대리자 비동기 실행
- Factory.StartNew() 메서드 : Task 객체 생성 및 Action 대리자 비동기 실행
- Wait() 메서드 : Action 대리자 실행 완료 대기
◾ Systme.Threading.Tasks.Task< TResult > 클래스
- Func 대리자 실행
- Start() 메서드 : Func 대리자 비동기 실행
- Factory.StartNew() 메서드 : Task 객체 생성 및 Func 대리자 비동기 실행
- Wait() 메서드 : Func 대리자 실행 완료 대기
◾ Parallel 클래스
- 병렬 반복 코드를 지원
- Parallel.For() / Parallel.ForEach() 메서드에 반복 범위와 Action 대리자 인수로 입력
◾ async와 await (1/2)
- async 한정자
메서드, 이벤트 처리기, 태스크, 람다식 등을 수식
C#컴파일러가 async 한정자로 수식한 코드의 호출자를 만날 때 호출 결과를 기다리지 않고 바로 다음 코드로 이동하도록 실행 코드 생성 - async로 한정하는 메서드는 반환 형식이 Task나 Task< TResult > 또는 void 여야 함
실행하고 잊어버릴 작업을 담고 있는 메서드라면 반환형식을 void로 선언
작업이 완료 될 때 까지 기다리는 메서드라면 Task, Task< TResult > 로 선언
◾ async와 await (2/2)
- async로 한정한 Task또는 Task< TResult >를 반환하는 메서드/태스크/람다식은 await 연산자를 만나는 곳에서 호출자에게 제어 반환
- await 연산자가 없는 경우 동기로 실행
728x90
'C# > 이것이 C#이다' 카테고리의 다른 글
[C# 기초강의] Ch 21. 네트워크 프로그래밍 (0) | 2023.08.10 |
---|---|
[C# 기초강의] Ch 20. WinForm으로 만드는 사용자 인터페이스 (0) | 2023.08.10 |
[C# 기초강의] Ch 18. 파일 다루기 (0) | 2023.08.10 |
[C# 기초강의] Ch 17. dynamic 형식 (0) | 2023.08.10 |
[C# 기초강의] Ch 16. 리플렉션과 애트리뷰트 (0) | 2023.08.10 |