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 임의로 멈추는 방법
- ThreadState 알고있는 전제로 접근
- Abort() 메소드
- 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 |