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