본문으로 건너뛰기

스레드 안전(Thread Safety)

  • 멀티 스레드 환경에서 여러 스레드가 동시에 하나의 자원(함수 변수, 객체)에 접근해도 프로그램의 실행에 문제가 없는 것
  • 멀티 스레드 환경에서 여러 스레드가 동시에 데이터를 읽거나 쓰는 작업을 할 때, 데이터의 일관성과 정확성을 보장하는 것
  • 하나의 함수가 한 스레드로부터 호출되어 실행중일때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바르게 나오는 것

스레드 안전을 보장하기 위해서는 스레드 간의 동기화가 필요하다. 더 정확히는 공유 자원에 접근하는 임계영역을 동기화 기법으로 제어해줘야 한다.(상호 배제)

스레드 안전을 지키기 위한 4가지 방법

  1. Mutual Exclusion
  • 공유 자원에 하나의 Thread만 접근할 수 있도록 뮤텍스, 세마포어로 락을 통제하는 방법이다.
  1. Atomic Operation
  • 공유 자원에 접근할 때는 원자 연산을 원자적으로 분리한 뒤에 실제로 데이터 변경이 이루어지는 시점에 Lock을 걸고, 데이터를 변경하는 시간 동안 다른 스레드의 접근이 불가능하도록 하는 방법이다.
  • a+=b의 경우 먼저 + 연산을 한 뒤에 = 연산을 함으로, 원자적이라고 볼 수 없다.
  1. Thread LocalStorage
  • 공유 자원의 사용을 최대한 줄이고 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는 방법
  • 일반적으로 공유 상태를 피할 수 없을 때 사용하는 방식이며, 전역 변수 사용을 자제하라는 뜻으로 생각할 수 있다.
  1. Re-Entrancy
  • 스레드 호출과 상관없이 프로그램에 문제가 없도록 작성하는 방법이다.
  • 어떤 함수가 한 스레드에 의해 호출되어 실행 중이라면 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바르게 주어져야 한다.
  • 스레드끼리 독립적으로 동작할 수 있도록 코드를 작성하는 것으로 생각하면 된다.

Reference