linux 컴파일 옵션 -D_REENTRANT 에 대해..

hypnosis의 이미지

스레드 공부하다가 thread-safe function 에 대해서 봤는데요.

보다가 보니 컴파일 옵션 -D_REENTRANT 또는 헤더 선언 이전에 매크로로 _REENTRANT 해서

사용하면 일반적인 함수 를 사용하더라도 자동으로 안전한 함수로 변경할 수 있다는 내용을 봤습니다.
(열혈강의 TCP/IP 프로그래밍)

지금까진 그냥 안전하게 _r 이 있는 함수면 _r을 붙여서 사용했는데 만약 컴파일 옵션만으로 일반 함수가

_r 붙인 스레드에 안전한 함수로 동작할수 있다는 사실이 맞는지.. 궁금해서 물어봅니다..^^..

yhsuk의 이미지

http://www.linuxmisc.com/3-solaris/b02cbef791567338.htm

_REENTRANT does basically 3 things:
1. makes sure getc/putc et. al are functions rather than macros.
2. makes sure errno(s) are thread-specific -- make sure you include errno.h!
3. enables several *_r (i.e. reentrant) functions,

http://kldp.org/node/59271

위 KLDP 링크를 보시면 대부분 구현에서 TLS(Thread-Local Storage)를 사용하여 static 지역변수를 대체하도록 되어 있는 것으로 보입니다. (하지만 *_r 함수 사용시보다 느릴 것으로 보임)
저게 2005년 글이니 대부분 구현에 적용되어 있을 것으로 보이지만 그래도 라이브러리에 따라 다를 수 있으므로 *_r을 쓰는게 좋지 않을까 합니다.

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"

익명 사용자의 이미지

책 내용이 틀린 것 같네요.

_REENTRANT 매크로를 정의한다고 자동으로 쓰레드 안전한 함수로 변경되지 않습니다.

쓰레드 안전 함수는 POSIX 표준에서 thread-safe로 지정한 함수들만 안전하게 작동합니다.
쓰레드 안전하지 않은 함수 목록은 POSIX 홈페이지에서 볼 수 있습니다.

http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_09.html

예를 들어 strtok()는 reentrant 함수인 strtok_r()함수가 따로 있죠.
자동으로 strtok를 strtok_r로 변경해주진 않습니다.

아마 윈도우즈의 비주얼 스튜디오가 TLS를 이용해서 쓰레드 안전을 획득해주는데 표준에 근거한 작동은 아닙니다.

오히려 대부분의 유닉스 계열의 구현은 따로 쓰레드 안전으로 변경해주지 않습니다.

가장 확실한 쓰레드 안전은 자동으로 해주는 거 없습니다.
프로그래머가 알아서 안전한 함수 찾아서 써야 합니다.

hypnosis의 이미지

답변 달아주신분들 감사합니다!

속도면에서나 man page에서 명시한 스레드에 안전한 함수쓰는게

확실할꺼같네여:)

익명 사용자의 이미지

다른 책 보세요.

동영상 때문에 열혈강의 시리즈 많이 보나본데, 후배가 보길래 살펴봤는데 내용이 별로더군요.
쉽게 설명은 하는데 개념은 좀 오해의 소지가 많게 해두고,
C 표준에서 하지 말라던 undefined behavior도 떡하니 해놨더군요.
열혈강의 저자는 C 언어 표준도 모르는 게 아닐까 생각 되더군요.

예제코드도 좀 엉망이라 후배에게 보지 말라고 했습니다.

굳이 쉬운 책 찾는다면 일본쪽 저자가 쓴 초급책이 좋더군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.