2013-12-05 2 views
5

Рассмотрим следующий код:ошибка сегментации при доступе к статически инициализируется __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 не должна работать? Может ли быть нарушена работа операционной системы?

+2

Посмотрите: https://bugzilla.redhat.com/show_bug.cgi?id=731228 кажется проблемой gcc 4.6. – Damon

+1

Есть полдюжины подобных отчетов, рассказывающих о segfaults. Я попытаюсь, если выберете более крупный тип (возможно, 'int'), и попробуйте использовать более новый GCC. – Damon

+0

Это сработало чудесно. Спасибо, Деймон! – Hongli

ответ

0

Вы забыли сообщить компилятору, что хотите поддерживать потоки. Скорее всего, флаг -pthread.

+0

Уверен? Вам нужны специальные флаги компилятора для использования стандартного ключевого слова C++ 11? Я был бы удивлен, если бы это было так (хотя, честно говоря, я никогда не использовал или не заботился о «__thread», поэтому я не знал). – Damon

+1

@Damon Это не стандартное ключевое слово C++ 11. Я думаю, вы думали о thread_local. __thread, насколько я знаю, является расширением GNU. Я попробую -pthread, я даже не знал, что нужно в Linux. – Hongli

+0

Нет кубиков. Компиляция с -pthread не помогла. Также не связывалась с -lpthread. – Hongli