线程本地存储macosx

时间:2010-03-13 00:40:39

标签: thread-local-storage

http://developer.apple.com/mac/library/documentation/DeveloperTools/gcc-4.0.1/gcc/Thread_002dLocal.html

文件__thread

然而我的g ++抱怨我的拱门不支持__thread(Macbookpro上的Leopard)。

这是为什么?我该如何解决它?

2 个答案:

答案 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

This problem has been filed as a bug。)