37 votes

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

J'obtiens:

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 - _GLIBCXX_USE_NANOSLEEP non défini?
Comment puis-je obtenir cet exemple pour compiler?


Mise à jour le 17 septembre 2012 (jogojapan): j'ai rencontré ce même problème aujourd'hui, à l'aide de GCC 4.7.1. Je me demande si il y a des nouvelles sur la manière de les éviter, d'autres que par la définition d' _GLIBCXX_USE_NANOSLEEP. J'ai essayé d'utiliser -std=gnu11, mais en vain.

Il y a aussi un vieux, en suspens rapport de bug de GCC 4.4: https://bugs.launchpad.net/ubuntu/+source/gcc-4.4/+bug/608145


Mise à jour 19 Oct 2012 (jogojapan): La question a été expliqué, et résolu par Jonathan Wakely comme une réponse à cette question: qu'est-Ce que _GLIBCXX_USE_NANOSLEEP tout au sujet? Ceci est particulièrement pertinent pour quiconque construit GCC lui-même au lieu d'utiliser un paquet pret.

30voto

Maister Points 2903

A confirmé qu'il ne fonctionne pas ici. (Version récente de GCC 4.6 instantané).

Vous pourriez faire de l'évidence et de définir simplement avant de vous inclure tous les std:: les en-têtes. Un peu sale, mais fonctionnera jusqu'à ce que GCC fixe (sauf si c'est un comportement intentionnel). Le #define ne devrait pas casser quelque chose, de toute façon. Soit à la source ou de l'-D_GLIBCXX_USE_NANOSLEEP drapeau à GCC.

Vous pourriez vouloir essayer-std=gnu++0x plutôt que d'-std=c++0x, depuis gnu++0x tire souvent dans des trucs comme ça.

7voto

steffen Points 1987

Des renseignements supplémentaires, au cas où il permet à 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 ne 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 la mise à jour de la version de la glibc. Au moins pas avant le week-end ;)

3voto

bjackfly Points 864

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X