[질문] 스레드 사용시,
글쓴이: bizzare / 작성시간: 화, 2005/11/01 - 11:55오전
일단 개념적인 질문을 먼저 올립니다.
제가 A, B, C 이렇게 3개의 동적라이브러리를 만들었습니다.
그리고 D라는 실행파일에서 이 라이브러리를 사용합니다.
그리고 C 라이브러리의 함수 내에서 스레드를 사용합니다.
즉, A, B, 는 직접적으로 스레드를 사용하지는 않는 셈이죠.
그런데 이런 경우에 A, B를 빌드할 때도 스레드에 관련된 옵션을 줘야하는지요?
VC의 경우에는 스레드를 쓰는 라이브러리를 사용하거나, 스레드를 쓰는 라이브러리에게 사용당할 때에 스레드 옵션을 줘야 하는데, 리눅스(SUSE), 유닉스(SUN, HP, IBM) 등으로 할 때도 마찬가지라면 줘야 할 것 같은데 확실하지가 않네요.
그리고 제가 아는 스레드 관련 옵션은, -lpthread , -D_REENTRAN 인데, 이 옵션이 바로 위에서 이야기한 스레드옵션인지, 아니면 또 다른 옵션이 있는지도 알고 싶습니다.옵션
Forums:
Re: [질문] 스레드 사용시,
줘야합니다. 그 예는 errno 같은 변수가 재진입가능한 버전으로될 때는 함수로 구현이 됩니다. 즉 생성되어 나오는 object가 다른 것을 참조하게 됩니다.
-lpthread는 어떤 쓰레드를 쓰느냐에 따라 달라질 수 있고,
-D_REENTRANT 는 넣어 줘야합니다.
위 두 개가 기본적이며, OS 혹은 OS 버전에 따라서 c 대신 c_r 을 써야하기 때문에 -lc_r 을 써야하는 경우가 있습니다.
---
http://coolengineer.com
저... 죄송한데여... -D_REENTRANT 가 무슨 옵션인가
저... 죄송한데여...
-D_REENTRANT 가 무슨 옵션인가요? ^^
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
재진입이 가능한 함수들을 사용하겠다는 옵션입니다.쓰레드에서 안전한 함
재진입이 가능한 함수들을 사용하겠다는 옵션입니다.
쓰레드에서 안전한 함수들을요...
최근의 리눅스는 거의 모든 함수들 그리고 변수는 매크로로 함수리턴값형태로
최근의 리눅스는 거의 모든 함수들 그리고 변수는 매크로로 함수리턴값형태로 바뀌어 쓰레드에 대해 안전하게 구현된 glibc를 배포하고 있습니다.
따라서 _REENTRANT의 정의가 필요없기는 합니다만, 그렇지 않은 외부 라이브러리지원이나 다른 OS로의 이식을 고려한다면, 항상 _REENTRANT를 사용해줘야합니다.
각종 OS에서
grep _REENTRANT /usr/include/*
명령을 수행해서 나오는 위치들을 살펴보세요. defined되었는지에 따라서 함수들이 선언되고 안되고, 또는 같은 함수라 할지라도 인자나 참조하는 변수가 달라지는등 몇몇 중요한 변경이 일어납니다.
이들을 더 깊이 따라가면 오래된 코드와 쓰레드에 안전한 코드가 공존하여 선택적으로 달라지는 것도 볼 수 있습니다.
---
http://coolengineer.com
그렇군요. 감사합니다. ^^
그렇군요. 감사합니다. ^^
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
한가지 더 궁금합니다만...
만약 그렇다면...
멀티쓰레드 환경에서 컴파일시에 _REENTRANT 옵션만 준다면
inet_ntoa()와 같은 함수도 Thread Safe하다고 볼수 있는 건가요?
strncpy(buf, inet_ntoa(어쩌구), sizeof(buf));
모 이런거...
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
아.. man page를 읽어서 명시적으로 쓰레드에 대해 안전하다고 된
아.. man page를 읽어서 명시적으로 쓰레드에 대해 안전하다고 된 것만 안전합니다. :)
대개 _r 이 붙어서 재진입에 대해 가능하게 만들어지던 시절이 있었고,
최근에는 같은 이름으로 쓰레드 고유저장소에 정보를 두어 만들어지는 것이
대부분입니다.
참고로,
재진입(REENTRANT)이라는 것이 언제나 시스템에서 제공하는 쓰레드에 대해서만 사용되는 것은 아닙니다.
우리가 접할 수 있는 것의 대부분의 재진입성(REENTRANT) 코드들은 쓰레드와 관련되어 있지만,
signal 처리로도 재진입이 가능하고, 사용자가 setjmp 를 이용하여 자체 구현한 다중 문맥일 수도 있습니다.
즉, 재진입이라는 것의 한 예가 쓰레드이고, 대부분의 예일뿐 항상 일치하는 것은 아닙니다.
아뭏든지간에... 명시적으로 가능/불가능을 항상 확인하고 사용해야합니다. 8)
---
http://coolengineer.com
넵! 알겠습니다.대단히 감사합니다. :D
넵! 알겠습니다.
대단히 감사합니다. :D
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
댓글 달기