reentrant 와 thread-safe 는 다른 말이다

멀티 플랫폼을 대상으로 된 라이브러리를 MAC 용으로 포팅을 하다보니 신기한 문제를 발견했다.

 

MAC에서는 _r 계열 함수가 제대로 없는 것이다. _r 계열 함수는 reentrant 즉, 재진입 가능 함수를 의미한다.

 

착각하기 쉬운것이, thread-safe 하면 reentrant 하다고 생각하기가 쉬운데, 이 두개는 서로 다른 개념이다.

 

 즉 Thread-Safe 라는 것은 A,B 두개의 스레드가 strtok 같은 함수를 이용한다고 할 때,  각각의 스레드에서는 strtok가 호출될 때 문제가 없으면 된다. 보통 이럴 경우 내부적으로 해당 데이터를 TLS 에 넣어두면 thread-safe 하다고 볼 수 있다. 그런데 reentrant 할려고 한다면 문제가 발생할 수 있다.

 

 같은 스레드 안에서 strtok 가 두 번 불려진다면? 과연 다음과 같은 코드는 기대한 결과가 나올것인가?

 

  1. strtok(A, 어쩌구);
  2. strtok(B, 어쩌구);
  3. strtok( NULL, 어쩌구 );
  4. strtok( NULL, 어쩌구 );

 물론 위와 같은 형태로 바로 작성할 사람은 별로 없겠지만, Message 방식일 경우 가끔씩

위와 같은 문제가 발생할 수 가 있다. 그래서 strtok_r 같은 함수는 해당 결과를 가져올 수 있는 파라매터가 하나 더 있는 것이다. 즉, 몇번이고 strtok_r 이 불려지더라도, 원하던 결과로 동작할 수 있다.

 

 흐음, 그런데 MAC에는 왜 그 함수가 없었을 까? 함수명이 생각이 안난다. -_-