文件__thread
然而我的g ++抱怨我的拱门不支持__thread(Macbookpro上的Leopard)。
这是为什么?我该如何解决它?
答案 0 :(得分:4)
将您的gcc升级到gcc-4.5或更高版本(通过macports或其他东西)。 Mac上的TLS操作比在linux或其他unix上更昂贵,因为它是模拟的。
以下代码:
__thread int foo; void f() { ++foo; }
在linux上,它将被翻译成:
f: pushl %ebp movl %esp, %ebp movl %gs:foo@NTPOFF, %eax addl $1, %eax movl %eax, %gs:foo@NTPOFF popl %ebp ret
但是在mac上,它会被翻译成这个(两个函数调用!!):
_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 :(得分:2)
我认为该页面只是标准GCC手册上的Apple样式表。请注意Mac OS X中的.so
而不是.dylib
。
因此,Mac上的gcc完全有可能不支持__thread
。您需要手动使用pthread_setspecific
。