inflearn logo
강의

講義

知識共有

アラン iOS Concurrency(並行処理) - Dispatch QueueとOperation Queueの理解

2) ディスパッチグループの使用(非同期ディスパッチグループ)

[7-3.DispatchBarrier] 예제 코드 질문

解決済みの質問

325

chunnysoft5042

投稿した質問数 2

0

 

아래 예제 코드에서 "threadSafeNameGroup.notify" 가 정상적으로 동작하려면, 그룹의 enter와 leave 를 사용해주어야 하는 것이 아닌가? 라는 생각이 들었습니다.


스크린샷 2023-12-25 오전 5.34.10.png

왜냐하면 "barrierThreadSafePerson.changeName" 메소드가 async로 작업을 보내기 때문입니다.

 

그럼에도 정상적으로 동작하는 이유는 barrier 플래그를 설정했기 때문에, 현재 쓰레드를 블락처리 했기 때문에 정상적으로 동작했는 것이 아닌가하는 추측을 하고 있습니다.

 

왜 enter 와 leave가 사용이 되지 않았는지 궁금합니다.

ios swift 동시성

回答 1

0

allen

아 네네, 안녕하세요 재천 님!

디스패치 그룹 사용시, async내부의 작업들이
(1) 동기적인 형태의 작업들이라면 굳이 enter / leave를 사용하시지 않아도 됨(PDF파일 154페이지)
(2) 비동기적인 형태의 작업들이라면 반드시 enter / leave를 사용해야 함 (PDF파일 162페이지)

이런 내용을 설명드렸었죠!

그런데 질문주신 아래의 코드에서..

image
캡처하신 것처럼.. 이 코드에서는..
threadSafeNameGroup으로 작업을 async로 보낼때의..
내부 작업의 코드의 형태가 동기적이라고 보셔도 무방하긴 합니다. (동기와 비슷하게 동작함)

여기서,

barrierThreadSafePerson.changeName(firstName: name.0, lastName: name.1) 

여기 부분이.. 정확하게 말하면
아래처럼, async(비동기)로 실행시키는 것은 맞으나,

image
barrier(장벽) 작업 자체는 async로 보내서 실행하는 것이 맞긴 하지만
내부적으로 한번에 1개의 쓰레드에서만 접근이 가능하도록 만들기 때문에..
실질적으로는 sync처럼 동작하게 됩니다.

형태는 비동기이나, 실질 동작이 sync처럼 동작하게 되어서..
질문주신 내부의 코드가 다 동기(sync)로 쓰여있다고 보시면 됩니다.


그래서, 여기서는 enter / leave를 굳이 쓰지 않으셔도 notify로 일의 종료 시점을 파악할 수 있습니다. :)

(물론 디스패치 그룹의 enter / leave 메커니즘의 경우, 내부적으로 갯수를 세는 방식으로 쉽게 동작하도록 구현이 되어 있기 때문에 동기적으로 동작하는 경우에 써도 전혀 무방하긴 합니다.)


따라서, 결론적으로
이 코드에서 구현된 동작은 (예상하신대로 배리어로 동작하기 때문에)
실질이 동기(sync)적으로 동작해서.. 굳이 enter / leave를 쓰지 않아도 종료 시점을 notify받을 수 있으나,
enter / leave를 써도 무방하긴 합니다. 🙂


감사합니다..!
좋은 연말 시간 되세요 !

오퍼레이션 큐 질문

0

128

2

2) 오퍼레이션큐(OperationQueue) 강의 질문입니다

0

145

2

warning 뜸

0

151

1

수업자료 markup 에 대해 궁금합니다!

0

273

1

예제 프로젝트 빌드 실패

0

331

2

serial 큐 질문드립니다.

0

251

1

안녕하세요, GCD 관련 질문드립니다..

0

284

1

main.async 작동 질문(+ vs global(),async)

0

432

1

dismiss 되었을 때 종료질문

0

303

1

'동기'와 '동시성 프로그래밍'에 대해 질문드립니다.

0

491

2

Dependency Protocol 관련

1

364

1

시리얼 큐와 sync 관련

0

464

2

sync이지만 Queue에 넣으면 async로 동작한다는 말의 의미

0

645

1

lazy var 이슈로 생긴 여러 변수들은 어디에 있나요?

0

385

1

global큐에 sync로 작업을 보냈을 때는 터지지 않는 이유가 궁금합니다.

1

501

2

비동기 개념에서 무엇을 return하는 거죠??

0

391

1

안녕하세욤

1

339

1

Barrier 작업 관련 질문입니다.

1

340

1

디스패치 그룹

1

381

1

global async안에 global async를 만들게되면 어떻게 되나요??

2

379

2

동기적 함수를 비동기적 함수로 바꾸는 부분에서 질문 있습니다

1

285

2

비동기오퍼레이션 관련 질문

1

369

1

강의자료는 어디에 있나요?

1

321

1

AsyncOperation을 async await Task로 대체 가능한 지에 대한 질문

1

410

1