[질문] 스레드 사용시,

bizzare의 이미지

일단 개념적인 질문을 먼저 올립니다.

제가 A, B, C 이렇게 3개의 동적라이브러리를 만들었습니다.

그리고 D라는 실행파일에서 이 라이브러리를 사용합니다.

그리고 C 라이브러리의 함수 내에서 스레드를 사용합니다.

즉, A, B, 는 직접적으로 스레드를 사용하지는 않는 셈이죠.

그런데 이런 경우에 A, B를 빌드할 때도 스레드에 관련된 옵션을 줘야하는지요?

VC의 경우에는 스레드를 쓰는 라이브러리를 사용하거나, 스레드를 쓰는 라이브러리에게 사용당할 때에 스레드 옵션을 줘야 하는데, 리눅스(SUSE), 유닉스(SUN, HP, IBM) 등으로 할 때도 마찬가지라면 줘야 할 것 같은데 확실하지가 않네요.

그리고 제가 아는 스레드 관련 옵션은, -lpthread , -D_REENTRAN 인데, 이 옵션이 바로 위에서 이야기한 스레드옵션인지, 아니면 또 다른 옵션이 있는지도 알고 싶습니다.옵션

pynoos의 이미지

bizzare wrote:
즉, A, B, 는 직접적으로 스레드를 사용하지는 않는 셈이죠.

그런데 이런 경우에 A, B를 빌드할 때도 스레드에 관련된 옵션을 줘야하는지요?

줘야합니다. 그 예는 errno 같은 변수가 재진입가능한 버전으로될 때는 함수로 구현이 됩니다. 즉 생성되어 나오는 object가 다른 것을 참조하게 됩니다.

bizzare wrote:
VC의 경우에는 스레드를 쓰는 라이브러리를 사용하거나, 스레드를 쓰는 라이브러리에게 사용당할 때에 스레드 옵션을 줘야 하는데, 리눅스(SUSE), 유닉스(SUN, HP, IBM) 등으로 할 때도 마찬가지라면 줘야 할 것 같은데 확실하지가 않네요.

그리고 제가 아는 스레드 관련 옵션은, -lpthread , -D_REENTRAN 인데, 이 옵션이 바로 위에서 이야기한 스레드옵션인지, 아니면 또 다른 옵션이 있는지도 알고 싶습니다.옵션

-lpthread는 어떤 쓰레드를 쓰느냐에 따라 달라질 수 있고,
-D_REENTRANT 는 넣어 줘야합니다.

위 두 개가 기본적이며, OS 혹은 OS 버전에 따라서 c 대신 c_r 을 써야하기 때문에 -lc_r 을 써야하는 경우가 있습니다.

kuaaan의 이미지

저... 죄송한데여...

-D_REENTRANT 가 무슨 옵션인가요? ^^

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

ktd2004의 이미지

재진입이 가능한 함수들을 사용하겠다는 옵션입니다.
쓰레드에서 안전한 함수들을요...

pynoos의 이미지

최근의 리눅스는 거의 모든 함수들 그리고 변수는 매크로로 함수리턴값형태로 바뀌어 쓰레드에 대해 안전하게 구현된 glibc를 배포하고 있습니다.

따라서 _REENTRANT의 정의가 필요없기는 합니다만, 그렇지 않은 외부 라이브러리지원이나 다른 OS로의 이식을 고려한다면, 항상 _REENTRANT를 사용해줘야합니다.

각종 OS에서
grep _REENTRANT /usr/include/*
명령을 수행해서 나오는 위치들을 살펴보세요. defined되었는지에 따라서 함수들이 선언되고 안되고, 또는 같은 함수라 할지라도 인자나 참조하는 변수가 달라지는등 몇몇 중요한 변경이 일어납니다.

이들을 더 깊이 따라가면 오래된 코드와 쓰레드에 안전한 코드가 공존하여 선택적으로 달라지는 것도 볼 수 있습니다.

kuaaan의 이미지

그렇군요. 감사합니다. ^^

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

kuaaan의 이미지

만약 그렇다면...
멀티쓰레드 환경에서 컴파일시에 _REENTRANT 옵션만 준다면
inet_ntoa()와 같은 함수도 Thread Safe하다고 볼수 있는 건가요?

strncpy(buf, inet_ntoa(어쩌구), sizeof(buf));
모 이런거...

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

pynoos의 이미지

아.. man page를 읽어서 명시적으로 쓰레드에 대해 안전하다고 된 것만 안전합니다. :)

대개 _r 이 붙어서 재진입에 대해 가능하게 만들어지던 시절이 있었고,
최근에는 같은 이름으로 쓰레드 고유저장소에 정보를 두어 만들어지는 것이
대부분입니다.

참고로,
재진입(REENTRANT)이라는 것이 언제나 시스템에서 제공하는 쓰레드에 대해서만 사용되는 것은 아닙니다.
우리가 접할 수 있는 것의 대부분의 재진입성(REENTRANT) 코드들은 쓰레드와 관련되어 있지만,
signal 처리로도 재진입이 가능하고, 사용자가 setjmp 를 이용하여 자체 구현한 다중 문맥일 수도 있습니다.
즉, 재진입이라는 것의 한 예가 쓰레드이고, 대부분의 예일뿐 항상 일치하는 것은 아닙니다.

아뭏든지간에... 명시적으로 가능/불가능을 항상 확인하고 사용해야합니다. 8)

kuaaan의 이미지

넵! 알겠습니다.
대단히 감사합니다. :D

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.