버그 해결을 위한 모든 질문을 던져
0 votes
183 views

sleep함수에 관해 msdn 에서 가져온 내용이 다음과 같습니다.

https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleep

Threads that are under concurrency control. For example, an I/O completion port or thread pool limits the number of associated threads that can run. If the maximum number of threads is already running, no additional associated thread can run until a running thread finishes. If a thread uses Sleep with an interval of zero to wait for one of the additional associated threads to accomplish some work, the process might deadlock.

동시에 수행될 수 있는 associated thread의 최대 개수가 정해져 있는 상황에서, (CreateCompletionPort의 NumberOfConcurrentThread)

이미 최대개수의 associated Thread (저는 GQCS를 호출하는 함수로 이해했습니다.) 가 실행중에 있다면,

추가적인 associated thread 는 이미 실행중인 스레드가 마치기 전까지는 실행될 수가 없다...

그러니 실행중인 associated thread에서 Sleep(0)를 호출하게 되면 데드락이 생긴다는 겁니다...

여기서 이해가 가질 않습니다.

최대개수를 정해두었다면 실행중인 스레드에서 sleep을 하더라도 어짜피 스케쥴링 되지가 않을텐데,

어떻게 데드락이 생기는 것일까요 ??

asked (38 point)
수정됨 , 183 views

1 답변

0 votes
우수 답변
생각해봤는데 제가 영문 해석을 잘못한 것은 아닌가 합니다...

한번 sleep(0) 호출이 아니고,

to wait for one of the additional associated threads to accomplish some work 를 보았을때... wait이 눈에 밟히네요

아마도 최대 개수로 실행중인 스레드들이 기대하는 결과에 대해 스핀락을 도는 상황을 이야기 하는 것 같습니다.

스핀락을 도는 상황이라면 당연히 데드락이 발생하겠지요...영영 실행될 수 없으니..
answered (38 point)
Sleep(0)의 경우 우선순위가 같거나 높은 스레드들이 있을 시에 양보하는 것으로 알고 있고요. 우선순위가 낮은 스레드는 컨텍스트 스위칭 되지 못해서 Starvation상태가 되는 것으로 알고 있습니다. Yield를 사용하시면 우선순위에 상관없이 컨텍스트 스위칭 됩니다.

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

597 질문
758 answers
727 댓글
118,330 users