Рассмотрим следующий код:
#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 не должна работать? Может ли операционная система сломаться?
Вы забыли сообщить компилятору, что хотите поддерживать потоки. Скорее всего, флаг -pthread
,
Других решений пока нет …