1

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

文档 __thread

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

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

4

2 回答 2

4

将您的 gcc 升级到 gcc-4.5 或更高版本(通过 macports 或其他方式)。mac 上的 TLS 操作比 linux 或其他 unix 上的操作要昂贵得多,因为它是模拟的。

以下代码:

__thread int foo;  
无效 f() {  
  ++富;  
}  

在 linux 上,它会被翻译成这样:

F:  
    推%ebp  
    movl %esp, %ebp  
    movl %gs:foo@NTPOFF, %eax  
    添加 $1, %eax  
    movl %eax, %gs:foo@NTPOFF  
    流行 %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  
    调用 ___emutls_get_address  
    movl (%rax), %eax  
    leal 1(%rax), %ebx  
    leaq ___emutls_v.foo(%rip), %rdi  
    调用 ___emutls_get_address  
    movl %ebx, (%rax)  
    addq $8, %rsp  
    流行音乐 %rbx  
    离开  
LCFI4:
    ret  
于 2011-03-04T02:12:13.113 回答
2

我相信该页面只是标准 GCC 手册上的 Apple 样式表。请注意Mac OS X 中的.so而不是。.dylib

所以 Mac 上的 gcc 完全有可能不支持__thread. 您需要pthread_setspecific手动使用。

此问题已作为错误提交。)

于 2010-03-13T05:58:43.007 回答