스핀 록은 CPU 사이클을 대기 (차단) 할 때 낭비하는 것만 큼 큰 것은 아닙니다. 신호가 깨어나기를 기다리는 동안 스레드가 잠자기 상태로 전환되면 회전하는 동안 CPU주기가 손실되지 않습니다.스핀 록을 사용하는 좋은 생각은 언제입니까?
잠금 장치를 잠깐 동안 유지 한 다음 스핀 록을 사용하면 시간이 절약 될 수 있습니다. 이것이 사실이라면 왜?
스핀 록은 CPU 사이클을 대기 (차단) 할 때 낭비하는 것만 큼 큰 것은 아닙니다. 신호가 깨어나기를 기다리는 동안 스레드가 잠자기 상태로 전환되면 회전하는 동안 CPU주기가 손실되지 않습니다.스핀 록을 사용하는 좋은 생각은 언제입니까?
잠금 장치를 잠깐 동안 유지 한 다음 스핀 록을 사용하면 시간이 절약 될 수 있습니다. 이것이 사실이라면 왜?
네, 맞습니다.
컨텍스트 스위치가 값 비쌉니다. OS와 CPU는 컨텍스트 전환을 수행하기 위해 상대적으로 많은 작업을해야합니다. 이론적으로 그 사이클이 낭비 되더라도 몇 사이클 동안의 회전은 훨씬 저렴할 것입니다.
스핀 록은 차단하지 않으면 빠르므로 스핀 록은 잠금 장치에 경합이 매우 낮은 상황 (즉, 잠겨있을 확률이 매우 낮습니다)에서 유용합니다.
스레드가 잠자기가되면 컨텍스트 전환이 발생합니다 (즉,이 스레드는 다른 스레드가 실행될 수 있도록 다른 스레드로 스왑 됨). 스핀 락 (spinlock)이 없는지 확인하는 것보다 표준 뮤텍스를 획득하는 데 보통 더 높은 오버 헤드가 있습니다. 매우 자주 스핀 록은 잠금 장치가 해제되어있을 때 단일 원자 조작 만 필요합니다.
작은 잠금을 사용하면 각 잠금에 대한 경합이 줄어들 기 때문에 이러한 속성은 스핀 잠금을 세밀한 잠금에 유용합니다. 예를 들어, 내 프로젝트 중 하나에 16,000 개 이상의 스레드가 동시에 액세스하는 ~ 200,000 개의 항목이있는 맵 (엔터프라이즈 서버 유형)이 있습니다. 항목 당 스핀 록을 갖는 것은 매우 효율적입니다.이 앱에서 두 개의 스레드가 동시에 같은 항목을 치려고 할 가능성이 낮기 때문입니다.
스핀 록을 사용하면 잠금을 사용할 수있을 때보다 빠른 폴링과 더 빠른 웨이크 업이 가능합니다. @Chris가 지적한 바와 같이 비경쟁적인 자물쇠에도 좋다. 내가 사용하는 스핀 락을 말할 것이다 :
당신이 걱정하는 모두가 자신의 응용 프로그램의 성능, 그리고 다른 애플 리케이션에 굴복하지 않고 앱이 코어의 수보다 < = 스레드가있는 경우. 그러나 티켓 잠금이 캐시 누락을 최적화하기 위해 여전히 고려 될 것입니다 ... 또한 회전하지만 캐시 누락을 많이 줄입니다.
또는, 당신의 잠금이 덜
당신은이 주제에 대한 위키 피 디아 항목 (http://en.wikipedia.org/wiki/Spinlock)를 확인 할 수 있습니다 주장하는 경우. 매우 유익한 것 같습니다. :) – gbvb