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(); } 

在Ubuntu 10.04(32位)上使用gcc 4.4.3版本:

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

我得到:

 error: 'sleep_for' is not a member of 'std::this_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没有定义?
我如何得到这个例子来编译?


更新2012年9月17日 (jogojapan):今天我遇到了同样的问题,使用GCC 4.7.1。 我想知道是否有任何关于如何避免它的消息,除了定义_GLIBCXX_USE_NANOSLEEP 。 我尝试使用-std=gnu11 ,但无济于事。

GCC 4.4还有一个旧的,未解决的bug报告: https : //bugs.launchpad.net/ubuntu/+source/gcc-4.4/+bug/608145


更新date2012年10月19日 (jogojapan):这个问题现在已经由Jonathan Wakely解释和解决,作为这个问题的答案: 什么是_GLIBCXX_USE_NANOSLEEP? 这对于自己构buildGCC而不是使用现成包装的人来说尤其重要。

证实它在这里也不起作用。 (最近的GCC 4.6快照)。

你可以做明显的,并简单地定义它,然后再包含任何std ::标头。 有点肮脏,但会工作,直到GCC修复它(除非这是预期的行为)。 #define不应该破坏任何东西。 无论是在源代码或-D_GLIBCXX_USE_NANOSLEEP标志到GCC。

你可能想尝试使用-std = gnu ++ 0x而不是-std = c ++ 0x,因为gnu ++ 0x通常会像这样引入。

附加信息,以防止他人帮助:

我不需要在Ubuntu 11.10,gcc 4.6.1,glibc 2.13中定义_GLIBCXX_USE_NANOSLEEP

但我确实需要在Gentoo上使用-D_GLIBCXX_USE_NANOSLEEP进行编译,gcc 4.6.1,glibc 2.12.2。

我不打算编译更新glibc的Gentoo系统。 至less在周末之前;)

似乎工作没有定义在Ubuntu 13.04使用GCC版本4.7.3

需要在源代码的顶部定义_GLIBCXX_USE_NANOSLEEP

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

或者,编译以下逗号:

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