• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Async, Await

21.04.26 22:51 작성 조회수 338

1

안녕하세요. [Async, Await] 강의 부분에서 12:20 부분에 break point를 잡고 확인해 볼때 저는 스레드하나가 나올줄 알았는데 작업자 스레드 하나가 생겨서 혼란이 왔습니다. 그러면 주 스레드와 작업자 스레드가 둘이 일을 처리하고 있다는건데, 이러면 멀티스레드로 작동되고 있는것 아닌가요? 앞에 설명에서는 Async,Await이 하나의 스레드로 비동기식으로 왓다갓다하면서 일을 처리한다고 이해를 해서요.

답변 2

·

답변을 작성해보세요.

1

async, await는 멀티쓰레드랑 직접적인 상관은 없으며
유니티의 코루틴처럼 코드를 비동기로 실행시키는 것입니다.
관련하여 다음 글을 읽어보면 도움이 됩니다.
https://blog.stephencleary.com/2013/11/there-is-no-thread.html

Task task = 무엇무엇; 으로 Task를 만들면 비동기로 실행하는 일감을 묘사한 것이고,
해당 task가 끝나야 다음 코드를 진행해야 한다면
await task를 하면 되는데
일종의 만남의 장소(?)가 정해진 셈이 됩니다.

12:20 코드는 아직 완성된 것이 아니며
저렇게 TestAsync를 생으로 호출하기보다는
static async Task TestAsync();  와 같이 TestAsync도 Task를 반환하게 해준 후,
Main 에서도 await를 해주는 식으로 만들어야 합니다.

async/await 자체가 멀티쓰레드를 개입시키는 것은 아니지만,
Task.Run과 같이 쓰레드풀의 다른 쓰레드를 개입시키는 행동을 하면
멀티쓰레드로 잠시 돌아갈 수는 있습니다.
한마디로 비동기는 [싱글쓰레드/멀티쓰레드] 양쪽 상황 모두 상관없지만
그렇다고 비동기 = 멀티쓰레드라고 생각하면 절대 안 됩니다.

0

--님의 프로필

--

2021.07.29

삭제된 글입니다
한종훈님의 프로필

한종훈

2022.05.12

저도 공부하는 단계라서 정확하지 않을수 있습니다.

 

주 쓰레드는 await 키워드를 만나면 (task가 바로 끝나서 async가 필요 없을때를 제외하고서는) return문을 만난것 처럼 함수 밖으로 나가버립니다.  await문 이후의 코드들은 보통은 task가 완료되었을때 Thread Pool의 background thread가 실행합니다.