2014-09-06 4 views
2

__thread 키워드/기능이 있는지 알려주는 함수/매크로를 찾을 수 없습니다. 예를 들어 __thread 키워드를 사용할 수 있는지 확인하십시오.

나는 HAS_TLS

#if HAS_TLS 
    static __thread int mytlsdata; 
#else 
    static pthread_key_t mytlskey; 
#endif 
+0

이것은 크게 컴파일러에 따라 다릅니다. 어느 쪽을 사용하고 있습니까? – JustSid

+0

저는 LLVM을 사용하고 있습니다. 하지만 크로스 컴파일러 솔루션을 찾고 있습니다. – d3L

답변

5

유일한 미리 정의 된, 짝수 가깝게 표준 일,

#if __STDC_VERSION__ >= 201112L && !defined __STDC_NO_THREADS__ 
    static _Thread_local int mytlsdata; 
#endif 

그러나이 정의 사용자없이 이런 일을하고 싶지 등가의 C11 이전 기능을 감지하지 못합니다. 귀하의 __thread 그리고 __STDC_VERSION__이 컴파일러의 실제 기능을 정확하게 반영한다고 가정하면 역사적으로 현명하지 못합니다.

보통이 시점에서 Autoconf을 권장하지만,이를 감지 할 수있는 기성 테스트가없는 것 같습니다. 그리고 전에 Autoconf로 아무 것도하지 않았다면 이것은 아마도 장소가 아닙니다. 시작한다. 죄송합니다 더 도움이 될 수 없습니다.

2

키워드를 사용하는 TLS 지원은 컴파일러에 따라 다릅니다. LLVM/clang은 __thread을 사용하고 VisualC++은 __declspec(thread)을 사용하지만 C++ Builder는 __thread__declspec(thread) 등을 모두 지원합니다. TLS 키워드를 사용할 수 있는지 또는 실제로 어떤 키워드인지 확인하기위한 사전 컴파일러 매크로는 없습니다. TLS를위한 플랫폼 간 코드를 작성하려면 그에 따라 특정 컴파일러와 코드를 감지해야합니다.

관련 문제