文档 __thread
但是我的 g++ 抱怨我的拱门不支持 __thread(Macbookpro 上的 Leopard)。
为什么是这样?我该如何解决?
文档 __thread
但是我的 g++ 抱怨我的拱门不支持 __thread(Macbookpro 上的 Leopard)。
为什么是这样?我该如何解决?
将您的 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
我相信该页面只是标准 GCC 手册上的 Apple 样式表。请注意Mac OS X 中的.so
而不是。.dylib
所以 Mac 上的 gcc 完全有可能不支持__thread
. 您需要pthread_setspecific
手动使用。
(此问题已作为错误提交。)