Pre*_*rag 37 c++ concurrency g++ c++11
当我尝试编译这个简单的程序时:
#include<thread>
void f() {
std::this_thread::sleep_for(std::chrono::seconds(3));
}
int main() {
std::thread t(f);
t.join();
}
Run Code Online (Sandbox Code Playgroud)
在Ubuntu 10.04(32位)上使用gcc版本4.4.3:
$ g++ -std=c++0x -pthread a.cpp -o a
Run Code Online (Sandbox Code Playgroud)
我明白了:
error: ‘sleep_for’ is not a member of ‘std::this_thread’
Run Code Online (Sandbox Code Playgroud)
我看着标题'线程'.
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)
...
Run Code Online (Sandbox Code Playgroud)
为什么_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已经解决并解决了这个问题,作为这个问题的答案:_GLIBCXX_USE_NANOSLEEP到底是什么? 这对于自己构建GCC而不是使用现成包的任何人来说尤为重要.
Mai*_*ter 30
确认它在这里也不起作用.(最近的GCC 4.6快照).
在包含任何std :: headers之前,您可以做到显而易见并简单地定义它.有点脏,但会工作,直到GCC修复它(除非这是预期的行为).#define不应该破坏任何东西.在源代码或-D_GLIBCXX_USE_NANOSLEEP标志到GCC.
你可能想尝试使用-std = gnu ++ 0x而不是-std = c ++ 0x,因为gnu ++ 0x经常会引入这样的东西.
其他信息,以防有人帮助:
我不需要_GLIBCXX_USE_NANOSLEEP在Ubuntu 11.10,gcc 4.6.1,glibc 2.13中定义.
但我确实需要在Gentoo,gcc 4.6.1,glibc 2.12.2上使用-D_GLIBCXX_USE_NANOSLEEP进行编译.
我不打算编译Gentoo系统来更新glibc.至少不是在周末之前;)