• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

sync, async 질문

21.07.16 17:24 작성 조회수 309

1

안녕하세요.
sync, async 에 대해서 잘 이해가 가지 않는 부분이 있어서 질문드립니다.
1. sync와 async는 "메인" 쓰레드에서 큐에 작업을 넣고, 이를 OS가 다른 Thread로 배분하는데 이 작업이 끝나기를 오직 "메인" 쓰레드에서 기다리는지의 여부로 이해했는데 정확한 걸까요?
메인이 아닌 다른 쓰레드에서도 sync, async 구분이 될 수 있나요?
2. 메인 쓰레드에서 큐에 async인 작업1을 넣어서 다른 쓰레드A에서 그 작업1을 하게 되었다고 하고, 그리고 그 작업1에는 또 concurrent큐에 sync인 작업2를 넣는 코드가 있었다고 합시다.
2-1. 작업2를 직접 수행하는건 쓰레드A가 되나요?
2-2. 쓰레드B는 sync 작업2를 실제로 수행할 쓰레드라고 할 때, 쓰레드A에서는 쓰레드B에서 작업 2를 끝내고 리턴될때까지 쓰레드 A의 작업1이 block되는 건가요?
쓰레드A에서 또 다른 쓰레드B로 넘어가게 될 테니 메인쓰레드가 아닌 쓰레드A에서 쓰레드B가 끝날때까지 기다리는건가 싶습니다... 잘 모르겠습니다 ㅠㅠ

답변 1

답변을 작성해보세요.

1

네, mi kim 님 안녕하세요!

사실 답변을 드리면.. 너무 빨리 질문을 주신게 아닌가 하네요^^; 사실 뒤에 다 나오는 내용이거든요. 그래도 일단 말씀을 드려볼께요.



1. 번 질문에 대한 답변

오직 메인쓰레드에서만 기다리는 개념이 아닙니다.
어떤 쓰레드인지든 상관없이 기다린다(sync)/기다리지 않는다(async)의 개념이예요. 그래서 예를 들어서 2번쓰레드에서 하는 일을.. 다시 또 다른 쓰레드로 일을 보낸다면.. 기다리거나 안 기다리거나 할 수 있습니다. ^^ 

예를 들어서

DispatchQueue.global( ).async {

           print("task1")

           DispatchQueue.global(qos:  .background ).async {

                          print("task2")

            }

}

이런형태의 코드 있다고 하면

이런 그림으로 동작하고 각각의 쓰레드에서 기다릴지 말지로 생각하시면 편합니다. 즉 작업 두개(task1/task2)를 일단은 둘다 2번쓰레드로 보냈는데 task2는 다시 다른 쓰레드로 보내집니다. 그렇다면, 여기서. 작업 task1은 메인쓰레드에서 기다리지 않는 개념이 되고, task2는 2번 쓰레드에서 기다리지 않는 개념이 됩니다.  


2.번 질문에 대한 답변

2번 질문에서 가정하신 상황이  (concurrent큐가 여러종류이므로 일단은 다른 동시큐라고 가정을 하면) 아래그림 처럼 될텐데,


2-1번 질문
: 작업2를 실제 직접 수행하는 건 (5번이 아닌) 2번 쓰레드(말씀하신 쓰레드A)가 맞습니다. (기다리는 개념이기 때문에 굳이 다른 쓰레드로 보낼 필요가 없기 때문이기도 하죠.) 내부 동작은 그렇게 동작합니다. 다만, 그렇게 생각하실 필요가 전혀 없습니다. 그냥 이론적으로 제가 위에 그려드린 대로 쓰레드 5번에서 동작한다고 생각하시는 게 그냥 편하고 머리속으로 더 잘 그려집니다. (실제 동작을 우리가 알 필요가 없고, 더 헷갈리기만 합니다.)

2-2번 질문: 작업1이 종료된다음, 작업 2를 sync로 보내는 작업을 하게 됩니다. 즉 작업 1이 다 종료된 다음 그제서야 이제 보내므로, block은 나중에 일어납니다.



일단 위에 제가 그려드린 그림을 보신 후에, 이해가 안되시면 또 질문 남겨주세요... ^^