Coding Memo

lock, spinlock 본문

Language/C#

lock, spinlock

minttea25 2023. 8. 8. 13:58

lock과 spinlock은 모두 멀티스레드 환경에서 공유 자원을 컨트롤하기 위한 동기화 메커니즘이다. 한 스레드가 접근 중일 때는 다른 스레드들은 대기하게 된다.

 

그렇다면 각각 어떤 특징이 있고, 어떤 상황에서 둘 중 무엇을 사용해야 더 성능면에서 유리하게 사용할 수 있을지 알아보았다.


대기 방식

- lock: 락을 얻을 때까지 대기를 하고, 대기하는 동안 CPU 자원을 사용하지 않음

- spinlock: busy-waiting 방식으로 다른 쓰레드가 락을 해제할 때까지 계속 루프를 돌면서 기다리고 이 대기 동안에 CPU를 계속 사용함

 

이 외에는 크게 의미 있는 차이가 없는 것 같다.

 

lock 방식은 CPU 자원을 많이 사용하지 않지만 lock을 얻고 해제하는데 다소 자원이 들어갈 수 있다. 

반면에 spinlock은 lock을 얻는데에 대기 시간을 둘 수도 있다. 하지만 대기 스레드가 많을 경우 대기 기간동안 CPU 자원을 계속 사용한다. (계속 lock을 얻을 수 있는지 확인)

 


요약

 

대부분의 상황에서는 lock을 쓰는 것이 간단하고 안전하다. 특히 lock을 얻기위한 대기 시간이 예측가능 하고 길지 않은 시나리오에서 좋다.

 

spinlock은 lock을 매우 짧은 대기로 얻을 수 있을 때(거의 바로 lock을 얻을 수 있을 때), lock을 사용하는 것보다 성능적인 이득을 볼 수 있다.

'Language > C#' 카테고리의 다른 글

.NET Framework, .NET Core, .NET Standard  (0) 2023.08.14
[C#][Serilog] Serilog 멀티스레드  (0) 2023.08.11
[C#] lock (Monitor)  (0) 2023.08.08
[C#] TCP 흐름제어 확인해보기  (0) 2023.07.17
[C#] SocketAsyncEventArgs.BufferList 참고사항  (0) 2023.07.16