-
카테고리
-
세부 분야
모바일 앱 개발
-
해결 여부
미해결
sync, async 질문
21.07.16 17:24 작성 조회수 309
1
iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
3) Synchronous(동기) VS Asynchonous(비동기)
강의실 바로가기
답변을 작성해보세요.
1
앨런(Allen)
지식공유자2021.07.16
네, 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은 나중에 일어납니다.
일단 위에 제가 그려드린 그림을 보신 후에, 이해가 안되시면 또 질문 남겨주세요... ^^
답변 1