Std:: this_thread:: sleep_for() и GCC
Когда я пытаюсь скомпилировать эту простую программу:
#include<thread>
void f() {
std::this_thread::sleep_for(std::chrono::seconds(3));
}
int main() {
std::thread t(f);
t.join();
}
с gcc версии 4.4.3 на Ubuntu 10.04 (32 бит):
$ g++ -std=c++0x -pthread a.cpp -o a
Я получаю:
error: ‘sleep_for’ is not a member of ‘std::this_thread’
Я посмотрел в заголовке 'thread'.
sleep_for() защищен _GLIBCXX_USE_NANOSLEEP
#ifdef _GLIBCXX_USE_NANOSLEEP
...
/// sleep_for
template<typename _Rep, typename _Period>
inline void
sleep_for(const chrono::duration<_Rep, _Period>& __rtime)
...
Почему _GLIBCXX_USE_NANOSLEEP
не определено?
Как получить этот пример для компиляции?
Обновление 17 сентября 2012 (jogojapan): Сегодня я столкнулся с этой же проблемой, используя GCC 4.7.1. Интересно, есть ли новости о том, как избежать этого, кроме определения _GLIBCXX_USE_NANOSLEEP
. Я попытался использовать -std=gnu11
, но безрезультатно.
Существует также старый, неразрешенный отчет об ошибке для GCC 4.4: https://bugs.launchpad.net/ubuntu/+source/gcc-4.4/+bug/608145
Обновление 19 октября 2012 г. (jogojapan): Вопрос теперь разъяснен и разрешен Джонатаном Вакели как ответ на этот вопрос: Что такое _GLIBCXX_USE_NANOSLEEP все о?
Это особенно актуально для тех, кто строит сам GCC вместо того, чтобы использовать готовый пакет.
Ответы
Ответ 1
Подтверждено, что он здесь тоже не работает. (Недавний снимок GCC 4.6).
Вы можете сделать очевидное и просто определить его, прежде чем включать любые std:: headers. Немного грязный, но будет работать до тех пор, пока GCC не зафиксирует его (если это не предполагается). #define ничего не сломает. Либо источник, либо флаг -D_GLIBCXX_USE_NANOSLEEP для GCC.
Возможно, вы захотите попробовать использовать -std = gnu ++ 0x, а не -std = С++ 0x, так как gnu ++ 0x часто тянет такие вещи.
Ответ 2
Дополнительная информация, если это кому-то помогает:
Мне не нужно определять _GLIBCXX_USE_NANOSLEEP
в Ubuntu 11.10, gcc 4.6.1, glibc 2.13.
Но мне нужно скомпилировать с -D_GLIBCXX_USE_NANOSLEEP на Gentoo, gcc 4.6.1, glibc 2.12.2.
Я не собираюсь компилировать систему Gentoo для обновления glibc. По крайней мере, не раньше уик-энда;)
Ответ 3
Кажется, работать без определения на ubuntu 13.04 с использованием gcc версии 4.7.3
Ответ 4
Необходимо определить _GLIBCXX_USE_NANOSLEEP
поверх исходного кода.
#define _GLIBCXX_USE_NANOSLEEP //add it top of c++ code
ИЛИ, Скомпилировать с помощью следующего commamd:
g++ a.cpp -o a -std=c++0x -D_GLIBCXX_USE_NANOSLEEP //compile c++ code
./a // run c++ code