2012-02-21 7 views
7

6 개의 스레드가 있습니다. 스레드 중 하나가 일부 범위에 들어 와서 '잠금'을 켜고 다른 모든 스레드는 대기 중이며 동일한 범위에 들어가기를 원합니다.'잠금'이 CPU 시간을 차지합니까?

이제 다른 스레드에 CPU 시간이 있습니까? 다른 스레드가 스레드 스케줄에 있습니까? 다른 모든 스레드가 대기 상태에 있다는 것을 알고 있지만 CPU가 스레드를 계속해서 범위에 액세스하려고 시도합니다 (범위에 액세스 할 수없는 경우에도)

+1

내 이해는 다른 스레드가 여전히 잠금 상태를 확인하는 데 사용할 timeslices를 수신한다는 것입니다. 자물쇠가 제자리에 있으면 잠자기 상태로 되돌아갑니다. 그렇지 않으면 자물쇠가 진행됩니다. – xbonez

+0

이것은 내가 또한 이해 한 것입니다 -하지만 이것은 CPU 시간이 걸립니다 ... 그래서 이것은 바쁜 대기 중입니다 - 그리고 이것은 매우 나쁩니다. – Yanshof

답변

10

잠금을 입력하려고하면 이미 수행 된 스레드는 잠시 동안 첫 번째 스핀 록을 스레드하고 마지막으로 대기 상태가되고 대기 상태가됩니다.

그들은 회전하는 동안 여전히 CPU 시간을 소모하지만 더 이상 기다리지는 않습니다.

+6

조금 확장하면 : spinwait은 커널 전환보다 저렴하므로 잠금이 가볍게 경합되는 경우를 최적화합니다. – Richard

+0

스핀 록이란 무엇입니까? 1 문장으로 대답 할 수 있니? –

+2

@Royi 스레드는 루프에서 룩이 없는지 계속 확인합니다. 'while (! lock.TryEnter()) {}'과 같은 것은 CPU를 굽히지 만 커널 전환과 쓰레드 스케줄링의 오버 헤드를 피한다. 잠금 장치가 곧 해제되면 좋지만 시간이 오래 걸리는 것은 좋지 않습니다. 그렇기 때문에 '잠김'이 짧은 시간 동안 스핀 락을 기다렸다가 기다리는 것입니다. – CodesInChaos

0

어떻게 잠금 장치가 작동하지 않습니다. 누구에게도 "cpu time"을 더주지 않습니다. 당신이 잠그고 있다면, 쓰레드가 서로를 기다리고있는 대기 시간과 교착 상태를 야기 할 수 있습니다.

관련 문제