ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Thread-safe 와 reenterant
    기술 관련 2010. 2. 19. 16:12
    thread-safe하다와 reenterant 하다의 차이가 뭘까?

    둘 다 서로 multi thread 환경에서 사용되며 서로 다른 thread에서 동시에 해당 함수를 호출 하는 상황에 놓여 있을 때 생각해 보게 되는 말이다.

    먼저, thread safe 하지 않은 경우를 알아보자. 이 때는 이미 하나의 thread에서 실행되던 함수를 다른 thread에서 호출하여 실행 할 때 먼저 실행하던 thread가 알지 못하는 사이에 특정 값이나 상태가 변경되어, 처음 thread에서 실행된 함수의 실행결과를 보장하지 못하는 것을 말한다.

    그리고, thread-safe 한 것은 이와 같은 문제가 발생하지 않도록 조치가 취해진 상황을 말한다.

    renterant한 경우는 글자 그대로 그 함수에 재진입 할 수 있다는 것으로 내부에 존재하는 코드 중 다른 thread로 인해 값이 변경되는 부분이 없으므로 실행 결과를 보장하는 것을 말한다.

    차이가 느껴지는가?

    좀더 설명을 곁드리자면, reenterant 한 함수는 thread-safe 한 함수 이지만, thread-safe 한 함수가 항상 reenterant 한 것은 아니다. 즉, thread-safe한 경우라 할지라도 어떤 경우는 reenterant 하지 않는 상태가 될 수 있다.

    아래 코드를 보면 이에 대한 이해에 도움이 될 것이다.

    다음 코드는 threadsafe한 함수의 예로 static 변수를 두고 함수가 호출 될 때 마다 그 값을 증가시킨 후 값을 얻는다. 참고로 여기서 사용한 코드는 pseudo code로 개념만 설명한 것이다.

    static int value;

    int threadsafe() {
        threadlock();
        int tmp = value;
        tmp++;
        value = tmp;
        threadunlock();
        return tmp;
    }

    즉, threadsafe가 호출 될 때 내부에서 access하는 value는 다른 thread에서 접근하지 못하는 상태가 되므로 이 함수는 thread safe하다고 말할 수 있다. 그러나 reenterant하다고는 말할 수 없는 상태이다.

    다음 코드는 입력된 값에 1을 더하는 함수의 예이다.

    int reenterant(int value) {
        int tmp = value;
        tmp++;
        return tmp;
    }

    물론 이 함수는 위의 threadsafe 함수와는 다른 기능이다. 그러나, reenterant의 에제로는 충분하다. reenterant 함수의 특징은 함수 내부에서 처리하는 코드와 외부 코드가 완전히 단절되어 있다는 점이다. 입력과 출력이 분명하며 공유자원을 접근하는 경우는 없다.

    multithreaded programming에서의 또하나의 특징은 threadlock/unlock이 없어도 되므로 처리속도가 매우 빨라지게 된다. 그러나 이를 위한 구조적인 설계가 필요하며 공유되는 자원에 접근하는 경우는 결국 threadlock/unlock을 사용할 수 밖에 없게 된다.

    따라서, 두 가지의 차이점을 명확히 알고 필요한 부분에 적합하게 사용하면 보다 효율적이고 안정된 multithreaded 프로그램을 개발 할 수 있을 것이다.

    댓글

Designed by Tistory.