文档 __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手动使用。
(此问题已作为错误提交。)