멀티스레딩 필수 개념: 스레드-안전(Thread-safe) vs 재진입가능(Reentrant)
멀티스레딩 환경에서는 여러 스레드가 동시에 공유 자원에 접근하거나 수정할 때 발생할 수 있는 문제들을 해결하는 것이 중요합니다. 이에 대해 두 가지 중요한 개념인 Thread-safe 와 재진입 가능(Reentrant) 이 있습니다. 이 두 개념은 서로 다른 방식으로 동시성 문제를 해결하는데 사용됩니다. 이 포스트에서는 그 차이점을 명확하게 설명하고, 각각의 개념이 어떻게 다르게 동작하는지 이해할 수 있도록 정리해보겠습니다.
Thread-safe란?
여러 스레드에서 동시에 안전하게 호출될 수 있는 함수. ->
pure
함수나 스레드간 공유 객체 접근 시 뮤텍스 등을 잠구고 있는 함수 등
Thread-safe 이란, 여러 스레드가 동시에 특정 자원에 접근해도 그 자원의 일관성이 깨지지 않고 안전하게 동작할 수 있는 특성을 의미합니다. thread safe한 코드나 객체는 여러 스레드가 동시에 해당 자원에 접근해도, 예상치 못한 동작이나 데이터 손상 없이 올바르게 작동할 수 있습니다.
예시:
thread safe한 객체를 만들기 위해서는 자원의 접근을 synchronization하거나, 병렬 실행 시 문제가 발생하지 않도록 상태를 적절히 관리하는 방법을 사용합니다.
예를 들어, C++에서 std::mutex
를 사용하여 여러 스레드가 동시에 데이터를 수정하지 않도록 할 수 있습니다.
C++ 예시 (Thread-safe):
1 |
|
위 예제에서 std::mutex
는 스레드 간 충돌을 방지하여 thread-safe하게 동작합니다.
재진입 가능(Reentrant) 이란?
두 개 이상의 스레드가 호출할 때, 실제 실행이 interleaving 되더라도 각 스레드가 함수를 순서에 관계없이 차례대로 실행한 것처럼 보장되는 함수. -> 재귀 한수를 포함한 병렬 실행을 완벽히 보장해야함
Reentrant 은 특정 함수나 메서드가 한 스레드 내에서 여러 번 호출될 수 있으며, 다른 스레드에 의해 호출될 때도 그 동작이 안전하다는 특성을 의미합니다. 재진입 가능한 함수는 호출 중인 함수가 다시 호출되는 상황에서도 안전하게 동작할 수 있습니다.
예시:
재진입 가능한 함수는 함수 내부에서 사용하는 자원을 수정하지 않거나, 함수 호출 시 내부 상태가 변경되더라도 다른 호출이 영향을 미치지 않도록 설계됩니다.
C++ 예시 (Reentrant):
1 |
|
이 예제에서 factorial
함수는 재진입 가능하며, 하나의 호출이 다른 호출에 영향을 미치지 않도록 설계되어 있습니다.
Thread-Safe와 Reentrant의 차이
Thread safe는 여러 스레드가 동시에 자원에 접근해도 문제가 없도록 보장하는 반면, 재진입 가능은 동일한 함수나 메서드가 여러 번 호출되더라도 안전하게 동작하는 특성입니다.
Thread safe는 주로 동기화(mutex, locks 등)를 통해 동시성 문제를 해결하는 방식으로, 다른 스레드가 자원에 접근하는 동안 경쟁 상태를 방지합니다. 반면, 재진입 가능은 내부 상태의 독립성에 중점을 두며, 특정 함수나 메서드 내에서의 상태 변경이 여러 번 호출되는 것에 영향을 미치지 않도록 합니다.
Thread safe를 구현하기 위해서는 외부에서 다른 스레드와의 경쟁을 막는 방식이 필요할 수 있지만, 재진입 가능은 함수 내부에서의 상태 관리에 중점을 둡니다.
주요 차이점:
특성 | Thread-safe | 재진입 가능(Reentrant) |
---|---|---|
정의 | 여러 스레드가 동시에 자원에 접근해도 안전하게 동작하는 특성 | 함수나 메서드가 여러 번 호출될 수 있는 안전성 |
사용 예시 | 동시성 문제 해결을 위한 동기화(mutex, locks 등) | 재귀 호출 시 안전하게 동작하는 함수 |
핵심 포인트 | 자원에 대한 동시 접근을 방지 | 함수 내부 상태 관리 및 재귀 호출 가능성 |
구현 방법 | 동기화 기법(락, 뮤텍스 등) 사용 | 상태 변경을 최소화하고, 외부 의존성을 제거 |
결론
Thread safe와 재진입 가능은 멀티스레딩 환경에서 각각 중요한 역할을 합니다. Thread safe는 여러 스레드가 동시에 자원에 접근할 때 발생할 수 있는 문제를 해결하는 반면, 재진입 가능은 동일한 함수가 여러 번 호출되어도 안전하게 동작할 수 있도록 보장합니다. 이 두 개념을 잘 이해하고 적절히 활용하면, 멀티스레딩 환경에서의 동시성 문제를 효과적으로 해결할 수 있습니다.