Обязательно ли мне добавлять макрос _REENTRANT во время компиляции, чтобы сделать мой поток errno безопасным? - PullRequest
7 голосов
/ 18 мая 2011

Требуется ли для меня добавить макрос _REENTRANT во время компиляции, чтобы сделать мой поток errno безопасным?

Если нет, так ли это для всех версий gcc / linux / solaris или дляопределенные старые версии?

Недавно я тестировал фрагмент кода, в котором _REENTRANT не использовался, и обнаружил, что ошибка ведет себя в неопределенной последовательности в многопоточной среде?Но после добавления _REENTRANT все работало нормально.Окружение было Solaris.

Но обсуждение здесь , похоже, не говорит о том, что добавление _REENTRANT обязательно.я немного смущен.

Кроме того, кроме _REENTRANT, я должен добавить добавление каких-либо других опций или библиотек, чтобы убедиться, что в моем приложении есть потокобезопасный номер ошибки?

Ответы [ 2 ]

10 голосов
/ 18 мая 2011

На практике _REENTRANT является устаревшим мусором, когда потоки считались расширением, взломанным поверх существующих реализаций, и поведение стандартной библиотеки по умолчанию не было поточно-ориентированным.Это не должно быть необходимо в современных реализациях, и это никогда не было стандартом.(Обратите внимание, что это также неправильно, так как reentrant и thread-safe имеют радикально разные значения.)

Теоретически, POSIX требует, чтобы вы запрашивали и использовали следующееПараметры конфигурации через getconf, если вы компилируете потоковую программу:

  • POSIX_V7_THREADS_CFLAGS
  • POSIX_V7_THREADS_LDFLAGS

С другой стороны,У gcc есть собственный конфликтующий «переносной» способ запроса поддержки потоков: опция -pthread, которая обычно добавляет любые предопределенные макросы и библиотеки, необходимые для работы потоков.

1 голос
/ 18 мая 2011

Обычно вам нужно скомпилировать с параметром, подобным -mt -pthread -thread (это верно для Sun CC и, для некоторых платформ, для gcc). С помощью этой опции вы получаете определение, которое вам нужно. Если вы не используете его, вы можете связать неверную библиотеку или даже получить проблему с генерацией кода (например, отсутствие защиты от инициализации статических переменных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...