해결된 질문
작성
·
175
2
2) 현재의 큐에서 현재의 큐로 동기적으로 보내서는 안된다
라고 말씀해주셨습니다.
그 이유가
Q.async{ Q.sync{ task1 } }
에서
그림과 같이 설명하신 부분에
thread1(th1)에 있던 task1을 async로 th2에 보냈는데
다시 task1를 sync로 queue에보내면 th2는 block이되고
queue입장에서는 task1을 처리하기 위해 th2에 다시 접근하려고 하나 block이 되어 있는 상태라서 task1을 처리할 수 없는 상황이라고
설명을 해주셨습니다.
제가 생각하기에는 task1을 굳이 다시 th2가 아닌 비어있는 thread(th1, 3, 4 ... )에서 처리를 하면 되지 않을까요?
이경우 제가 잘못 이해하고 있는 개념이나 틀린 것이 있을까요?
답변 3
2
안녕하세요 기현님!
네 기현님께서 말씀하신 것처럼, 동시큐이기때문에 꼭 쓰레드2번이 아닌, 지금 일을 안하고 있는 3번, 4번쓰레드에서 처리를 하면 되지 않냐는 질문을 해주신 것이죠? 그리고 제가 질문을 이해한 바로 그림을 표현하면 (아래와 같이 될 것이고요..)
이런식이 될꺼고요? 제가 기현님이 설명해주신 상황을 이해한게 맞겠죠?
그렇다면, 기현 님께서 가정하신 상황에 대해서 정확하게 이해하신게 맞습니다. 동시큐이기 때문에 쓰레드 3번이나 4번으로 배치가 되면 교착상황이 발생하지 않을수도 있습니다. 다만, 작업이 쓰레드 2번에 배치될 수도 있어서.. 교착상황이 발생할 수 있는 그 가능성을 여전히 완벽히 배제할 수 없는 상황이 될 수 있습니다. (경우에 따라서 앱이 멈추는 경우는 발생하면 안되니까요..)
(큐가 작업을 쓰레드에 배치하는 일은 GCD에서 담당을 하고 있기 때문에.. GCD는 현재 2번 쓰레드가 block되어 있는 지 모를 수도 있습니다.)
다만 조금은 이론적인 내용이어서, 현재큐에서 현재큐로 sync메서드를 사용할 수 없다라는 정도만 이해하셔도 좋을 것 같습니다.^^ (저는 이해를 위해서 그림으로 설명 드린 것이고요.. ) 뒤쪽에서 조금 더 공부하시다보면, 또 작업을 다른 쓰레드로 보내서, sync메서드를 사용하는 부분이 있는데.. 그부분과 비교해서 보시면 더 이해가 잘 되실 수있습니다... ^^
의문점이 해결되셨길 바라며, 또 궁금한 점이 생기시면 언제든지 질문주세요.
고맙습니다. :)
1
0