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)로 설계