2010-03-13 5 views

ответ

2

Я считаю, что страница - это просто таблица стилей Apple, наложенная на стандартное руководство GCC. Обратите внимание на .so вместо .dylib в Mac OS X.

Так что вполне возможно, что gcc на Mac не поддерживает __thread. Вы должны использовать pthread_setspecific вручную.

(This problem has been filed as a bug.)

+0

Согласно Kerrisk в [Linux Programming Programming: Справочник по системному программированию Linux и UNIX] (http://www.amazon.com/dp/159 3272200), вам необходимо GCC 3.3 или выше для локального хранилища потоков ('__thread' для статических и глобальных объявлений). Mac OS X поставляется с GCC 4.2, поэтому похоже, что Apple удалила функциональность (или не вернула ее обратно). Он также требует поддержки ядра (Linux 2.6 и выше). что может объяснить, почему Apple не предоставила его. – jww

+0

Означает ли это, что мы все еще не можем скомпилировать 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' Тем не менее, я установил gcc v 4.9, используя 'brew install gcc49' – sAguinaga

4

Улучшайте куб.см до GCC-4.5 или выше (через MacPorts или что-то). Операция TLS на mac намного дороже, чем на Linux или другом unix, потому что она эмулируется.

Следующий код:

 
__thread int foo; 
void f() { 
    ++foo; 
} 

на Linux, он будет переведен на это:

 
f: 
    pushl %ebp 
    movl %esp, %ebp 
    movl %gs:[email protected], %eax 
    addl $1, %eax 
    movl %eax, %gs:[email protected] 
    popl %ebp 
    ret 

но на макинтош, он будет переведен на это (два вызова функции !!):

 
_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 
+1

Apple Tech Lab глупо об этом. Говорят, что они не хотят тратить реестр и делают его несовместимым, не понимая, что сегментные регистры не имеют другого применения, чем это больше. Действительно отстой. Даже если «__emutls_get_address» просто выполняет одну и ту же команду movl. Поэтому, если кто-то достаточно храбр, они могут вручную кодировать его как ассемблер, как это делается на linux. Кстати, это настоящая разборка? Я всегда думал, что это FS, который используется для TLS – Lothar

 Смежные вопросы

  • Нет связанных вопросов^_^