Blog

애플리케이션 레벨에서의 동시성 제어

뮤텍스 (Mutex, Mutual Exclusion)

뮤텍스는 상호 배제를 의미합니다.
한 번에 하나의 스레드만이 특정 자원이나 섹션의 코드에 접근할 수 있도록 허용합니다.
뮤텍스를 소유하고 있는 스레드만이 해당 자원을 사용할 수 있고, 다른 스레드는 뮤텍스가 해제될 때까지 대기해야 합니다.
뮤텍스는 '잠금'과 '해제' 두 가지 상태를 가집니다.
스레드가 뮤텍스를 잠그면, 해당 스레드는 작업을 마치고 뮤텍스를 해제할 때까지 다른 어떤 스레드도 잠긴 섹션에 접근할 수 없습니다.
이는 공유 자원을 하나의 스레드만 사용할 수 있도록 보장하여 데이터의 일관성을 유지합니다.

세마포어 (Semaphore)

세마포어는 뮤텍스보다 더 일반적인 동시성 제어 기법입니다.
세마포어는 카운트를 기반으로 한다는 점에서 뮤텍스와 차이가 있습니다. 이 카운트 값은 동시에 자원에 접근할 수 있는 스레드의 최대 수를 의미합니다.
세마포어의 값이 1이면 뮤텍스와 동일하게 작동합니다. 하지만, 값이 1보다 크면 여러 스레드가 동시에 공유 자원에 접근할 수 있습니다.
세마포어는 'P(Proberen)'과 'V(Verhogen)' 두 가지 연산으로 관리됩니다. P 연산은 자원을 획득하려 할 때 사용되고, V 연산은 자원을 방출할 때 사용됩니다.
세마포어는 뮤텍스와 달리 시스템 전체의 스레드 간 동기화에 사용할 수 있으며, 다양한 동시성 문제 해결에 적합합니다.
뮤텍스와 세마포어는 둘 다 애플리케이션에서 여러 스레드 또는 프로세스가 동시에 실행될 때 발생할 수 있는 동시성 문제를 방지하기 위해 사용됩니다.
이들은 공유 자원에 대한 접근을 제어하여 데이터의 무결성을 유지하고, 데드락과 같은 복잡한 동시성 문제가 발생하지 않도록 합니다.