web-dev-qa-db-fra.com

std :: this_thread :: sleep_for () et GCC

Lorsque j'essaie de compiler ce programme simple:

#include<thread>

void f() {
  std::this_thread::sleep_for(std::chrono::seconds(3));
}

int main() {
  std::thread t(f);
  t.join();
}

avec gcc version 4.4.3 sur Ubuntu 10.04 (32 bits):

$ g++ -std=c++0x -pthread a.cpp -o a

Je reçois:

error: ‘sleep_for’ is not a member of ‘std::this_thread’

J'ai regardé dans l'en-tête "thread".
sleep_for () est protégé par _GLIBCXX_USE_NANOSLEEP

#ifdef _GLIBCXX_USE_NANOSLEEP
...
/// sleep_for
template<typename _Rep, typename _Period>
  inline void
  sleep_for(const chrono::duration<_Rep, _Period>& __rtime)
...

Pourquoi est-ce _GLIBCXX_USE_NANOSLEEP non défini?
Comment puis-je obtenir cet exemple à compiler?


Mise à jour du 17 septembre 2012 (jogojapan): J'ai rencontré ce même problème aujourd'hui, en utilisant GCC 4.7.1. Je me demande s'il y a des nouvelles sur la façon de l'éviter, autrement qu'en définissant _GLIBCXX_USE_NANOSLEEP. J'ai essayé d'utiliser -std=gnu11, mais en vain.

Il existe également un ancien rapport de bogue non résolu pour GCC 4.4: https://bugs.launchpad.net/ubuntu/+source/gcc-4.4/+bug/608145


Mise à jour 19 octobre 2012 (jogojapan): Le problème a maintenant été expliqué et résolu par Jonathan Wakely en réponse à cette question: Qu'est-ce que _GLIBCXX_USE_NANOSLEEP all about? Ceci est particulièrement pertinent pour quiconque construit lui-même GCC au lieu d'utiliser un package prêt à l'emploi.

37
Predrag

Confirmé que cela ne fonctionne pas ici aussi. (Instantané récent de GCC 4.6).

Vous pouvez faire l'évidence et la définir simplement avant d'inclure des en-têtes std ::. Un peu sale mais fonctionnera jusqu'à ce que GCC le corrige (à moins que ce soit le comportement voulu). Le #define ne devrait de toute façon rien casser. Soit dans l'indicateur source ou -D_GLIBCXX_USE_NANOSLEEP à GCC.

Vous voudrez peut-être essayer d'utiliser -std = gnu ++ 0x plutôt que -std = c ++ 0x, car gnu ++ 0x tire souvent des trucs comme celui-ci.

30
Maister

Informations supplémentaires, au cas où cela aiderait quelqu'un:

Je n'ai pas besoin de définir _GLIBCXX_USE_NANOSLEEP dans Ubuntu 11.10, gcc 4.6.1, glibc 2.13.

Mais je fais besoin de compiler avec -D_GLIBCXX_USE_NANOSLEEP sur Gentoo, gcc 4.6.1, glibc 2.12.2.

Je ne vais pas compiler le système Gentoo pour mettre à jour la glibc. Du moins pas avant le week-end;)

7
steffen

Semble fonctionner sans définir sur ubuntu 13.04 en utilisant gcc version 4.7.3

3
bjackfly

Besoin de définir _GLIBCXX_USE_NANOSLEEP en haut du code source.

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

OU, compilez avec la commande suivante:

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