Рассмотрим следующий код:ошибка сегментации при доступе к статически инициализируется __thread переменной
#include <stdio.h>
__thread bool foo = true;
int
main() {
printf("foo = %d\n", foo);
return 0;
}
Compile и работать с:
$ 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 не должна работать? Может ли быть нарушена работа операционной системы?
Посмотрите: https://bugzilla.redhat.com/show_bug.cgi?id=731228 кажется проблемой gcc 4.6. – Damon
Есть полдюжины подобных отчетов, рассказывающих о segfaults. Я попытаюсь, если выберете более крупный тип (возможно, 'int'), и попробуйте использовать более новый GCC. – Damon
Это сработало чудесно. Спасибо, Деймон! – Hongli