해결된 질문
작성
·
224
0
아래 예제 코드에서 "threadSafeNameGroup.notify" 가 정상적으로 동작하려면, 그룹의 enter와 leave 를 사용해주어야 하는 것이 아닌가? 라는 생각이 들었습니다.
왜냐하면 "barrierThreadSafePerson.changeName" 메소드가 async로 작업을 보내기 때문입니다.
그럼에도 정상적으로 동작하는 이유는 barrier 플래그를 설정했기 때문에, 현재 쓰레드를 블락처리 했기 때문에 정상적으로 동작했는 것이 아닌가하는 추측을 하고 있습니다.
왜 enter 와 leave가 사용이 되지 않았는지 궁금합니다.
답변 1
0
아 네네, 안녕하세요 재천 님!
디스패치 그룹 사용시, async내부의 작업들이
(1) 동기적인 형태의 작업들이라면 굳이 enter / leave를 사용하시지 않아도 됨(PDF파일 154페이지)
(2) 비동기적인 형태의 작업들이라면 반드시 enter / leave를 사용해야 함 (PDF파일 162페이지)
이런 내용을 설명드렸었죠!
그런데 질문주신 아래의 코드에서..
캡처하신 것처럼.. 이 코드에서는..
threadSafeNameGroup으로 작업을 async로 보낼때의..
내부 작업의 코드의 형태가 동기적이라고 보셔도 무방하긴 합니다. (동기와 비슷하게 동작함)
여기서,
barrierThreadSafePerson.changeName(firstName: name.0, lastName: name.1)
여기 부분이.. 정확하게 말하면
아래처럼, async(비동기)로 실행시키는 것은 맞으나,
barrier(장벽) 작업 자체는 async로 보내서 실행하는 것이 맞긴 하지만
내부적으로 한번에 1개의 쓰레드에서만 접근이 가능하도록 만들기 때문에..
실질적으로는 sync처럼 동작하게 됩니다.
형태는 비동기이나, 실질 동작이 sync처럼 동작하게 되어서..
질문주신 내부의 코드가 다 동기(sync)로 쓰여있다고 보시면 됩니다.
그래서, 여기서는 enter / leave를 굳이 쓰지 않으셔도 notify로 일의 종료 시점을 파악할 수 있습니다. :)
(물론 디스패치 그룹의 enter / leave 메커니즘의 경우, 내부적으로 갯수를 세는 방식으로 쉽게 동작하도록 구현이 되어 있기 때문에 동기적으로 동작하는 경우에 써도 전혀 무방하긴 합니다.)
따라서, 결론적으로
이 코드에서 구현된 동작은 (예상하신대로 배리어로 동작하기 때문에)
실질이 동기(sync)적으로 동작해서.. 굳이 enter / leave를 쓰지 않아도 종료 시점을 notify받을 수 있으나,
enter / leave를 써도 무방하긴 합니다. 🙂
감사합니다..!
좋은 연말 시간 되세요 !