작성
·
22
0
class SpinLock
{
volatile int _locked = 0;
private readonly object _lock = new object();
public void Acquire()
{
while (true)
{
//int original = Interlocked.Exchange(ref _locked, 1);
//if (original == 0)
// break;
// CAS : Compare-And-Swap
//int original = Interlocked.CompareExchange(ref _locked, 1, 0);
//if (original == 0)
// break;
//int expected = 0;
//int desired = 1;
//if (Interlocked.CompareExchange(ref _locked, desired, expected) == expected)
// break;
lock (_lock)
{
if (_locked == 0)
{
_locked = 1;
break;
}
}
}
}
DeadLock 시간에 배웠던 lock 방식을 이용해서 작성해봤는데 출력 값은 0이 잘 나옵니다.
Q. SpinLock 구현할 때 InterLock 계열의 메서드를 사용해 구현한 것과 lock을 이용해 구현한 것은 어떤 차이가 있는지 궁금합니다.
강사님께서는 InterLock 을 통해 구현하셨는데 그 이유는 간단하게 사용할 수 있기 때문인가요??
SpinLock / BackOff Lock / Assisted Lock 이런 것을 구현할 때 위와 같이 lock 을 써서 구현하는 것은 구조적으로 잘못된 것인가요??
제가 이해한 것은 Lock 방식과 InterLock 방식은 하드웨어의 Instruction을 원자적으로 처리하기 위해 프로그래머가 C++/C# 같은 언어로 시키기 위한 방법인 것 같은데 이해를 똑바로 한 것인지 궁금합니다.
답변 2
0
lock은 C#에서 지원하는 방법이고,
그 내부 구현은 우리가 굳이 알 필요가 없으며
기본적으로 락을 구현하는 방법은 다양하게 있는데 그 중 하나가 스핀락입니다.
C++ Windows에서도 흔히 사용하던 CriticalSection 또한
초반엔 하드웨어 도움(Interlock 계열)을 받았는데 요즘은 스핀락을 어느 정도 사용하곤 합니다.
0
안녕하세요, 인프런 AI 인턴입니다. jiwonchoi3794님.
SpinLock 구현과 관련된 질문에 대해 몇 가지 유사한 질문과 답변을 찾아보았습니다.
CAS 구현: SpinLock을 구현할 때, CAS
(Compare-And-Swap)와 같은 원리적 기능을 일반 high-level 언어에서 어떻게 구현할 수 있는지에 대한 질문입니다. 대답에서 언급된 내용에 따르면, 이러한 기능은 CPU 또는 자료형 자체에서 원자성을 보장하도록 설계된 특수 기능을 사용해야 하며, 기본적 프로그램 언어의 문법만으로는 구현할 수 없다는 점을 설명하고 있습니다.
이해한 것이 맞는지 질문에서는 Lock의 작동 원리를 구체적으로 설명합니다. Lock은 자물쇠 같은 역할을 하며, 두 스레드가 동일한 리소스를 동시에 접근하지 못하도록 해주는 구조라고 이해할 수 있습니다. 이는 Interlocked 함수가 제공하는 원자적 연산을 이용해 경쟁 상태를 완화합니다.
SpinLock 구현의 방법적 차이점에 대한 질문에서는 Interlocked 함수가 제공하는 원자성의 이해와 그 코드 직관성, 즉 CPU의 연산을 직접 관리함으로써 발생하는 이점을 설명하는 부분이 있습니다. 이는 명령어가 변경되지 않는 상태에서 연산을 보장하기 위함입니다.
SpinLock과 같은 구조에서 lock
키워드를 사용하는 방법과 Interlocked
계열 메서드를 사용하는 방법의 주된 차이점은 lock
은 소프트웨어 레벨에서의 Mutex (Mutual Exclusion)를 제공하는 반면, Interlocked
는 하드웨어 레벨에서 원자성을 보장하는 것입니다. Interlocked
를 통한 원자적 연산은 보통 더 경량이고 빠르기 때문에 상황에 따라 적절히 선택해야 합니다.
위 질문들에서처럼, Interlocked 메서드는 하드웨어 지원을 직접 사용하여 빠르고 효율적인 동기화를 제공합니다. 일반 lock
은 더 복잡한 동기화가 필요하거나, 서로 다른 리소스를 동시에 접근할 가능성이 없는 상황에 적합하게 사용될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.