Вопрос по c++, gcc, glibc, sleep – Что такое _GLIBCXX_USE_NANOSLEEP?

43

Макрос препроцессора с именем _GLIBCXX_USE_NANOSLEEP появляется в двух стандартных заголовочных файлах:

C ++ / 4.7.1 / x86_64-неизвестно-Linux-гну / бит / с ++ config.hC ++ / 4.7.1 / резьба

В стандартной сборке GCC 4.7.1 (Linux, 64-bit) единственноеC ++ config.h включает в себя этот комментарий:

/* Defined if nanosleep is available. */
/* #undef _GLIBCXX_USE_NANOSLEEP */

Тогда как внитьопределениеstd::this_thread::sleep_for() а такжеstd::this_thread::sleep_until() зависит от макроса, который будет определен. Если это не такопределены, обе функции - хотя требуется стандартом C ++ - победил'не может быть определено либо.

В моей системе (glibc 2.15) макрос не определен, хотяnanosleep() функция (объявлена вctime) существует и работает.

Мне бы хотелось узнать, что это такое и как с этим бороться. В частности:

Есть ли параметр конфигурации, который следует использовать при сборке GCC для активации этого макроса по умолчанию, как это предлагаетсяэта почта? (Я не могне найти вонлайн документация по процессу сборки.)Есть ли действительно связь междуnanosleep() функция и макрос? Декларацияnanosleep() в /ctimetime.h похоже, не зависит и не определяет макрос.Есть ли какой-то определенный риск, связанный с определением макроса в моих собственных заголовочных файлах, или как-D опция в командной строке (как предложено вэтот связанный вопрос)? Что делать, если я делаю это в системе, гдеnanosleep() недоступен, и как я могу на самом деле узнать?

Обновить Начиная с GCC 4.8, поддержкаstd::this_thread::sleep_for() и тому подобное автоматически включается в libstdc ++. Флаг настройки больше не требуется. Отжурнал изменений GCC 4.8:

this_thread :: sleep_for (), this_thread :: sleep_until () и this_thread :: yield () определяются без использования параметра конфигурации --enable-libstdcxx-time;

Но обратите внимание на более подробную информацию об этом для GCC 4.8 и 4.9, приведенную в Jonathan 'ответ.

@nneonneo Отличная находка! Я попробую это. jogojapan
Вы сделали это сами или это C ++, поставляемый сопровождающим? nneonneo
В любой моментconfigure проверитьnanosleep? Что это сказал? nneonneo
@nneonneo, этодокументированный, и вы написали это неправильно (вы прочитали отчет об ошибке?), что 'почему это не такт работать на ОП. Это'только один получил "с" то есть--enable-libstdcxx-time Jonathan Wakely

Ваш Ответ

1   ответ
68

configure Скрипт проверяет вашу систему, чтобы увидеть, какие функции поддерживаются, и на основе результатов он определяет (или не определяет) различные макросы вc++config.h

В твоем случаеconfigure определили, что POSIXnanosleep() функция недоступна, а макрос не определен. Однако, как вы говорите,nanosleep() является доступно в вашей системе. Причина этого 'не включенconfigure является то, что чеки на это недаже не бегать, если вы не используете--enable-libstdcxx-time вариант (задокументировано вконфигурация глава руководства по libstdc ++, а не GCC настроить документы)

Есть ли параметр конфигурации, который следует использовать при сборке GCC для активации этого макроса по умолчанию, как предлагается в этом посте? (Я не могнайти его в онлайн-документации процесса сборки.)

Да,--enable-libstdcxx-time

Действительно ли существует связь между функцией nanosleep () и макросом? Объявление nanosleep () в ctime / time.h, похоже, не зависит от макроса и не определяет его.

Декларация о glibc 'функция независит от libstdc ++ 'с макро, нет. Но макрос сообщает libstdc ++, использовать ли функцию или нет.

Есть ли какой-то особый риск, связанный с определением макроса в моих собственных заголовочных файлах или в качестве опции -D в командной строке (как это предлагается в этом связанном вопросе)? Что делать, если я делаю это в системе, где функция nanosleep () недоступна, и как я могу это узнать?

Это'Непослушный и не поддерживается, но будет работать. Макрос - это внутренняя деталь реализации, которая должна настраиваться пользователем, а не пользователем, и изменять определение реализации ».Внутренние макросы могут сломать вещи. Но в этом случае он выигралт, потому что единственный код, который зависит от него, находится в заголовке, нет кода библиотеки вlibstdc++.so подвергается воздействию.

Но было бы лучше переустановить GCC и использовать--enable-libstdcxx-time вариант, или если этоневозможно редактироватьc++config.h определить макрос в true.

Если вы определите его в другой системе, гдеnanosleep() ISN»Я вам не доступенВы получите ошибку компиляции, когда вы.#include

у меня есть немногоидеи для улучшения этой конфигурации, такnanosleep() а такжеsched_yield() будет проверяться по умолчанию, но у меня нету них еще не было времени поработать над ними.

Обновление: яМы внесли некоторые изменения, так что сборка GCC 4.8 без--enable-libstdcxx-time будет по-прежнему определятьstd::this_thread::yield() (как неоператор) и будет реализовыватьstd::this_thread::sleep_for() а такжеstd::this_thread::sleep_until() используя более низкое разрешение::sleep() а также::usleep() функции вместо::nanosleep(), Это'еще лучше определить--enable-libstdcxx-time хоть.

Еще одно обновление: GCC 4.9.0 вышел и теперь по умолчанию автоматически включаетnanosleep а такжеsched_yield на платформах, которые, как известно, поддерживают их. Больше нет необходимости использовать.--enable-libstdcxx-time

Просто для подтверждения: после исправления орфографии опция сработала. Еще раз спасибо. jogojapan
Это отличный ответ и заслуживает многих голосов. (Сейчас я перестраиваюсь с правильно написанным параметром и сообщу, когда он будет закончен, но в любом случае это объясняет фон, который меня интересовал.) jogojapan

Похожие вопросы