본문 바로가기
유니티

Task / async-await / Thread / Deadlock 정리

by 유니티세상 2026. 3. 31.
반응형

1. Task

Task는 스레드가 실행할 작업 단위(논리적 작업)이며, 실행 상태와 완료 여부를 확인할 수 있다.

주요 특징

  • 상태 확인 가능
    • Task.Status (Running, Waiting, Completed, Faulted 등)
    • IsCompleted, IsFaulted, IsCanceled
  • 내부적으로 ThreadPool을 사용하여 실행됨
  • 작업 결과 및 예외를 포함함

예외 처리

Task 내부에서 발생한 예외는 자동으로 밖으로 던져지지 않는다.
반드시 await 또는 명시적 접근으로 처리해야 한다.

try
{
    await SomeTask();
}
catch (Exception exception)
{
    // 예외 처리
}

2. Task.WhenAll

여러 Task를 병렬로 실행하고 모두 완료될 때까지 기다릴 때 사용한다.

await Task.WhenAll(task1, task2, task3);

특징:

  • 모든 작업이 병렬 실행됨
  • 하나라도 실패하면 전체가 Faulted 상태가 됨

3. async / await

비동기 코드를 작성하기 위한 키워드

async

  • 메서드를 비동기로 선언
  • 내부에서 await 사용 가능

await

  • 작업이 끝날 때까지 기다린 후 이어서 실행
  • 스레드를 블로킹하지 않음 (중요)
public async Task ExampleAsync()
{
    await Task.Delay(1000);
}

핵심:

  • await는 “대기”가 아니라 “이후 실행을 예약”하는 개념

4. Task 연속 작업

ContinueWith

Task 완료 이후 작업을 이어서 실행

task.ContinueWith(t => { /* 후속 작업 */ });

하지만 실무에서는 다음 이유로 잘 사용하지 않는다:

  • 스레드 컨텍스트 관리가 어려움
  • 코드 가독성이 떨어짐

대신 await 사용이 권장됨

await task;
DoNextWork();

5. Task vs Thread

구조

프로세스
└── 스레드 (실제 실행 단위)
  └── Task (작업 단위)

차이

구분 Thread Task
레벨 OS .NET
역할 실행 주체 작업 단위
관리 직접 관리 자동 스케줄링
사용 목적 저수준 제어 비동기/병렬 작업

 

핵심:

  • Thread는 실제 실행 단위
  • Task는 실행할 작업
  • Task는 ThreadPool을 통해 병렬 실행 가능

6. Deadlock

둘 이상의 스레드가 서로 자원을 점유한 상태에서
서로의 자원을 기다리며 무한 대기하는 상태

예시

  • 스레드 A: lock A → lock B 대기
  • 스레드 B: lock B → lock A 대기

7. Deadlock 해결 방법

1. lock 순서 통일

모든 코드에서 동일한 순서로 lock 획득

2. lock 최소화

필요한 구간에만 lock 적용

3. 중첩 lock 제거

lock 안에서 또 다른 lock 사용 지양

4. 타임아웃 사용 (Monitor)

if (Monitor.TryEnter(lockObj, 1000))
{
    try
    {
        // 작업
    }
    finally
    {
        Monitor.Exit(lockObj);
    }
}

주의

  • lock 자체는 데드락을 방지하지 않는다
  • Mutex도 데드락을 해결하지 않는다 (동일하게 발생 가능)

최종 요약

  • Task는 스레드가 실행하는 작업 단위이며 상태와 결과를 가진다
  • async/await는 비동기 흐름을 쉽게 작성하기 위한 문법이다
  • Task는 ThreadPool을 통해 병렬 실행될 수 있다
  • ContinueWith 대신 await 사용이 권장된다
  • Deadlock은 잘못된 lock 사용으로 발생하며, 설계로 예방해야 한다

 

참고)

https://wjunsea.tistory.com/141

 

C# 비동기 프로그래밍 : Thread와 Task의 차이점

1. C# 비동기 프로그래밍 : Task 이해 2. C# 비동기 프로그래밍 : async, await 이해 3. C# 비동기 프로그래밍 : Task의 연속 작업 (Continuations) 이해 4. C# 비동기 프로그래밍 : Task와 Thread의 차이점 이번 포스

wjunsea.tistory.com

 

 

https://castlejune.tistory.com/55

 

스레드 풀(Thread pool) 제대로 이해하기

Thread per request model 백엔드 API 서버에서 요청을 처리하는 여러가지 방식이 있는데 그 중 하나가 Thread per request model 이다. Thread per request model 에서는 하나의 API Request 는 하나의 Thread가 처리하게 되

castlejune.tistory.com

 

반응형

'유니티' 카테고리의 다른 글

TextMeshPro(TMP) <link></link>, unity 텍스트 하이퍼링크  (0) 2026.04.23
AES-256 이란?  (0) 2026.04.01
c# 람다(Lambda)란?  (0) 2026.03.31
c# _  (0) 2026.03.31
Unity 6 와이어프레임 안보임  (0) 2026.03.24