【发布时间】:2013-12-23 00:56:57
【问题描述】:
考虑以下代码:
#include <stdio.h>
__thread bool foo = true;
int
main() {
printf("foo = %d\n", foo);
return 0;
}
编译并运行:
$ g++ tls.cpp -o tls -o tls
$ ./tls
在某些系统上 - 例如 Amazon Linux 2013.09.0、ami-5b792c32、内核 3.4.62-53.42.amzn1.i686、g++ 4.6.3 20120306 (Red Hat 4.6.3-2) - 这会导致只要访问foo,就会出现分段错误。
另一方面,在代码中显式初始化foo 不会导致分段错误:
#include <stdio.h>
__thread bool foo = true;
int
main() {
foo = true; /* Added!! */
printf("foo = %d\n", foo);
return 0;
}
为什么第一个代码示例在某些系统上会崩溃,而后者不会? __thread 变量的静态初始化不应该工作吗?操作系统会不会坏?
【问题讨论】:
-
看:bugzilla.redhat.com/show_bug.cgi?id=731228 好像是gcc 4.6的问题。
-
有六个类似的报告在谈论段错误。如果选择更大的类型(可能是
int)可行,我会尝试,否则尝试使用更新的 GCC。 -
效果很好。谢谢达蒙!
标签: c++ linux thread-local