std :: this_thread :: sleep_for () и GCC - PullRequest
       12

std :: this_thread :: sleep_for () и GCC

37 голосов
/ 14 декабря 2010

Когда я пытаюсь скомпилировать эту простую программу:

#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 сам, а не используетготовая упаковка.

Ответы [ 4 ]

29 голосов
/ 14 декабря 2010

Подтвердил, что здесь это тоже не работает.(Недавний снимок GCC 4.6).

Вы можете сделать очевидное и просто определить его, прежде чем включать какие-либо заголовки std ::.Немного грязно, но будет работать до тех пор, пока GCC не исправит это (если это не является предполагаемым поведением).#Define ничего не должен сломать.Либо в исходном коде, либо в флаге -D_GLIBCXX_USE_NANOSLEEP для GCC.

Возможно, вы захотите попробовать использовать -std = gnu ++ 0x вместо -std = c ++ 0x, поскольку gnu ++ 0x часто использует такие вещи, как этот.

7 голосов
/ 14 февраля 2012

Дополнительная информация, если кому-то это поможет:

Мне не нужно определять _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 голосов
/ 07 августа 2013

Кажется, работает без определения в Ubuntu 13.04, используя gcc версии 4.7.3

2 голосов
/ 16 января 2015

Необходимо определить _GLIBCXX_USE_NANOSLEEP поверх исходного кода.

#define _GLIBCXX_USE_NANOSLEEP  //add it top of c++ code

ИЛИ, скомпилировать с помощью следующей запятой:

g++ a.cpp -o a -std=c++0x -D_GLIBCXX_USE_NANOSLEEP    //compile c++ code
./a       // run c++ code
...