CS
스레드 세이프(Thread Safe)
koka
2025. 3. 13. 20:53
Thread Safe
- 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수,혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻함.
- 하나의 함수를 여러 스레드에서 호출하여 동시에 실행되더라도 함수의 결과가 올바르게 나오는 것을 정의한다.
Thread Safe를 지키기 위한 방법
- Re-entrancy(재진입성)
- 어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바르게 주어져야한다.
- Thread-local storage
- 공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막음
- 이 방식은 동기화 방법과 관련되어 있고, 또한 공유상태를 피할 수 없을 때 사용하는 방식
- Mutual exclusion(상호 배제)
- 공유 자원을 꼭 사용해야 할 경우 해당 자원의 접근을 세미포어 등의 락으로 통제한다.
- Atomic operations(원자 조작)
- 공유 자원에 접근할 때 원자 연산을 이용하거나 '원자적'으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현할 수 있다.
- Immutability(불변성)
- 데이터가 생성 후 변경되지 않도록 하여 공유 데이터에 대한 동시 접근 문제를 해결한다.
- 객체를 불변으로 만들어, 생성 시점에만 데이터를 할당하고 이후에는 변경할 수 없게 합니다.
- Isolation(고립)
- 작업을 독립적으로 만들어 서로 영향을 주지 않도록 합니다.
- 데이터베이스 트랜잭션에서 사용되는 고립 수준(isolation level) 설정 같이, 연산 간 영향을 줄이는 기술 사용
- Lock-Free Programming(락-프리 프로그래밍)
- 락을 사용하지 않고 동시성 문제를 해결하여 데드락(deadlock)이나 락 경쟁(lock contention)으로 인한 성능 저하를 방지
- 원자적 연산을 활용하여 공유 데이터 구조를 업데이트하거나, 데이터 구조 자체를 락-프리(lock-free) 또는 웨이트-프리(wait-free)로 설계