std :: this_thread :: sleep_for()和GCC

时间:2010-12-14 10:22:00

标签: c++ concurrency c++11 g++

当我尝试编译这个简单的程序时:

#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 -o a

我明白了:

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还有一个旧的未解决的错误报告:https://bugs.launchpad.net/ubuntu/+source/gcc-4.4/+bug/608145


2012年10月19日更新(jogojapan):现在,Jonathan Wakely解释并解决了这个问题:What is _GLIBCXX_USE_NANOSLEEP all about? 这对于自己构建GCC而不是使用现成包装的人来说尤为重要。

4 个答案:

答案 0 :(得分:27)

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

在包含任何std :: headers之前,您可以做到显而易见并简单地定义它。有点脏,但会工作,直到GCC修复它(除非这是预期的行为)。 #define不应该破坏任何东西。在源代码或-D_GLIBCXX_USE_NANOSLEEP标志到GCC。

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

答案 1 :(得分:7)

其他信息,以防有人帮助:

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

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

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

答案 2 :(得分:3)

似乎没有使用gcc版本4.7.3的ubuntu 13.04上的定义工作

答案 3 :(得分:2)

需要在源代码之上定义_GLIBCXX_USE_NANOSLEEP

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

OR,使用以下commamd进行编译:

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