http://developer.apple.com/mac/library/documentation/DeveloperTools/gcc-4.0.1/gcc/Thread_002dLocal.html스레드 로컬 스토리지에서라도
문서는 아직 내 아치 (맥북 프로에 레오파드)에서 지원되지 않습니다 그 __thread을 불평 ++ 내 g을
을 __thread.왜 이런가요? 어떻게 해결할 수 있습니까?
http://developer.apple.com/mac/library/documentation/DeveloperTools/gcc-4.0.1/gcc/Thread_002dLocal.html스레드 로컬 스토리지에서라도
문서는 아직 내 아치 (맥북 프로에 레오파드)에서 지원되지 않습니다 그 __thread을 불평 ++ 내 g을
을 __thread.왜 이런가요? 어떻게 해결할 수 있습니까?
나는이 페이지가 표준 GCC 매뉴얼에 씌어있는 애플 스타일 시트라고 믿는다. Mac OS X에서 .dylib
대신 .so
이 표시됩니다.
Mac에서는 gcc가 __thread
을 지원하지 않을 가능성이 있습니다. 수동으로 pthread_setspecific
을 사용해야합니다.
. Mac에서 TLS 작업은 에뮬레이트되기 때문에 Linux 나 다른 유닉스에서보다 훨씬 비쌉니다.
다음 코드 :
__thread int foo; void f() { ++foo; }
리눅스에서, 그것은이로 번역 할 것이다 :
f: pushl %ebp movl %esp, %ebp movl %gs:[email protected], %eax addl $1, %eax movl %eax, %gs:[email protected] popl %ebp ret
하지만 맥에
, 그것은 (이 함수 호출!)이 번역 될 것이다 : 에서 Kerrisk에 따르면_f: LFB0: pushq %rbp LCFI0: movq %rsp, %rbp LCFI1: pushq %rbx LCFI2: subq $8, %rsp LCFI3: leaq ___emutls_v.foo(%rip), %rdi call ___emutls_get_address movl (%rax), %eax leal 1(%rax), %ebx leaq ___emutls_v.foo(%rip), %rdi call ___emutls_get_address movl %ebx, (%rax) addq $8, %rsp popq %rbx leave LCFI4: ret
Apple Tech Lab에서이 문제에 대해 바보입니다. 그들은 레지스터를 낭비하고 세그먼트 레지스터가 더 이상 다른 용도로 사용할 수 없다는 사실을 깨닫지 못하게합니다. 정말 안됐다. 경우에도 "__emutls_get_address"는 단지 하나의 movl 명령을 수행하고 있습니다. 그래서 누군가가 충분히 용감하다면, 어셈블러가 리눅스에서 행해진 것처럼 인라인으로 수동으로 코딩 할 수 있습니다. 그건 그렇고,이게 진짜 분해입니까? 나는 항상 TLS에 사용되는 FS라고 생각했다. – Lothar
[리눅스 프로그래밍 인터페이스 : 리눅스 및 UNIX 시스템 프로그래밍 핸드북] (http://www.amazon.com/dp/159 3272200), 스레드 로컬 저장소 (정적 및 전역 선언에서'__thread')에 GCC 3.3 이상이 필요합니다. Mac OS X는 GCC 4.2와 함께 제공되기 때문에 Apple이 기능을 제거한 것처럼 보입니다 (또는 다시 포팅하지 않았을 때). 또한 커널 지원이 필요합니다 (Linux 2.6 이상). 왜 애플이 그것을 제공하지 않았는지를 설명 할 수있다. – jww
이것은 우리가 여전히 Mac OS X (10.10)에서 컴파일 할 수 없다는 것을 의미합니까? PyMetis (pip install pymetis)와'gcc --version'을 설치하려고 할 때 동일한 문제가 있습니다 :'Apple LLVM version 7.0.2 (clang-700.1.81) 대상 : x86_64-apple-darwin14.5.0 스레드 모델 : posix' 그러나'brew install gcc49'를 사용하여 gcc v 4.9를 설치했습니다. – sAguinaga