목록Lock (4)
Coding Memo
lock과 spinlock은 모두 멀티스레드 환경에서 공유 자원을 컨트롤하기 위한 동기화 메커니즘이다. 한 스레드가 접근 중일 때는 다른 스레드들은 대기하게 된다. 그렇다면 각각 어떤 특징이 있고, 어떤 상황에서 둘 중 무엇을 사용해야 더 성능면에서 유리하게 사용할 수 있을지 알아보았다. 대기 방식 - lock: 락을 얻을 때까지 대기를 하고, 대기하는 동안 CPU 자원을 사용하지 않음 - spinlock: busy-waiting 방식으로 다른 쓰레드가 락을 해제할 때까지 계속 루프를 돌면서 기다리고 이 대기 동안에 CPU를 계속 사용함 이 외에는 크게 의미 있는 차이가 없는 것 같다. lock 방식은 CPU 자원을 많이 사용하지 않지만 lock을 얻고 해제하는데 다소 자원이 들어갈 수 있다. 반면에 s..
멀티 쓰레드 환경에서는 여러 쓰레드가 한번에 어떤 공유 자원(전역 변수, 맴버 변수 등등)에 접근하고 수정하려고 하면 매우 큰 문제가 발생할 수도 있다. 아래 코드의 실행 결과를 예상해보자. class Program { static int n = 0; static void Thread1() { for (int i=0; i
각 용어의 정의를 간단히 설명 하자면... (요약) Atomic: 말그대로 원자성이란 뜻으로 Atomic 명령 실행 중에는 다른 어떤 간섭 없이 끝까지 실행됨을 보장 Lock: Multi-Thread 환경에서 여러 쓰레드가 공유하는 어떤 리소스(변수 등)에 접근하는 방법에 대한 메커니즘 Critical Section: Multi-Thread 환경에서 상호 배제를 보장하는 특정 구역(section) 공유 리소스 접근 컨트롤이 필요한 이유 아래 코드를 살펴보자. int n = 0; void Thread1() { for (int i = 0; i < 100000; i++) { n++; } } void Thread2() { for (int i = 0; i < 100000; i++) { n--; } } int ma..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. C++ 에서도 C11 부터 자체적으로 std에 lock을 지원해주고 있다. 기본적인 lock 기능만 사용할 경우 불편한 점이 몇가지 있다. 1. 표준 mutex로는 재귀적인 lock을 잡을 수 없다. (recursive_mutex가 있긴하다) 2. 메모리를 동시에 쓰거나 읽을 때는 반드시 원자적으로 접근해야하지만, 읽기만 할때는 반드시 원자적으로 접근 할 필요가 없다. (-> 많은 쓰레드들이 동시에 어떤 값을 읽기만 하는 것은 lock이 필요하지 않을 수 있다.) 따라서 위와 같은 불편한 점과 편의를 위해 직접 구현하기도 한다. 구현 핵심 lock을 가지고 있는 쓰레드들을 구분하기 위해 32bit 사용 상위 1..