Skip to content

스레드 안전성(Thread Safety)과 재진입성(Reentrancy)


멀티스레드 환경이나 인터럽트 처리에서 함수가 올바르게 동작하는지 보장하기 위해 두 가지 중요한 개념이 사용된다.


스레드 안전성(Thread Safety)

여러 스레드가 동시에 어떤 함수나 객체에 접근하더라도 프로그램의 실행 결과가 올바르게 보장되는 특성이다.

  • 특징:
    • 전역 변수나 정적(static) 변수와 같은 공유 자원을 여러 스레드가 동시에 접근할 때 발생하는 경쟁 상태(Race Condition)를 방지한다.
    • 뮤텍스(Mutex), 세마포어(Semaphore) 등의 동기화 기법을 사용하여 임계 구역을 보호함으로써 스레드 안전성을 달성할 수 있다.
    • 스레드 지역 저장소(Thread-Local Storage)나 원자적 연산(Atomic Operation)을 활용하기도 한다.

재진입성(Reentrancy)

어떤 함수가 실행되는 도중(인터럽트나 다른 스레드에 의해) 중단되고, 다른 실행 흐름에서 같은 함수를 다시 호출(재진입)하여 실행하더라도 각각의 호출이 올바른 결과를 반환하는 특성이다.

  • 특징:
    • 함수 내부에서 전역 변수나 정적 변수를 사용하지 않거나, 호출자가 제공한 상태(매개변수)만을 사용하여 독립적으로 동작해야 한다.
    • 함수 내에서 힙(Heap) 메모리 동적 할당(malloc, free)을 안전하게 사용할 수 없거나 제한될 수 있다. (기본 힙 할당자는 내부적으로 전역 락을 사용할 수 있으므로 재진입성이 보장되지 않을 수 있음)
    • 재진입이 불가능한 다른 함수를 내부적으로 호출해서는 안 된다.

스레드 안전성과 재진입성의 차이 및 관계

두 개념은 비슷해 보이지만, 동기화 기법의 사용 여부상태의 공유 방식에서 차이가 있다.

구분스레드 안전성 (Thread Safety)재진입성 (Reentrancy)
목적다중 스레드의 동시 접근으로부터 안전함실행 중단 후 재호출되어도 안전함
상태 보존전역/정적 변수를 락(Lock)으로 보호하여 사용 가능전역/정적 변수를 사용하지 않고 로컬 상태(스택, 레지스터)만 사용
인터럽트 환경락을 사용하는 경우 데드락(Deadlock) 위험 존재락을 사용하지 않으므로 인터럽트(시그널 핸들러)에서도 안전함

핵심 요약:

  • 재진입 가능한 함수는 항상 스레드 안전하다. (공유 자원 자체가 없으므로 동시 접근 문제도 발생하지 않음)
  • 스레드 안전한 함수가 항상 재진입 가능한 것은 아니다. (락을 통해 스레드 안전성을 확보한 함수는, 실행 도중 인터럽트가 발생하여 같은 스레드가 다시 그 함수에 진입할 경우 데드락에 빠질 수 있다)