web-dev-qa-db-ja.com

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 -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によって説明および解決されました: _GLIBCXX_USE_NANOSLEEP all about? これは、既成のパッケージを使用するのではなく、GCCを自分でビルドする人に特に関係があります。

37
Predrag

ここでも動作しないことを確認。 (最近のGCC 4.6スナップショット)。

Std ::ヘッダーをインクルードする前に、明白なことを行い、それを定義するだけです。少し汚いですが、GCCが修正するまで機能します(これが意図された動作でない限り)。 #defineが何も壊してはいけません。ソースまたはGCCへの-D_GLIBCXX_USE_NANOSLEEPフラグのいずれか。

-std = c ++ 0xではなく-std = gnu ++ 0xを使用することをお勧めします。これは、gnu ++ 0xがしばしばこのようなものを取り込むためです。

30
Maister

誰かを助ける場合の追加情報:

Ubuntu 11.10、gcc 4.6.1、glibc 2.13では_GLIBCXX_USE_NANOSLEEPを定義する必要はありません。

しかし、私はdo Gentoo、gcc 4.6.1、glibc 2.12.2で-D_GLIBCXX_USE_NANOSLEEPを使用してコンパイルする必要があります。

Glibcを更新するためにGentooシステムをコンパイルするつもりはありません。少なくとも週末の前ではありません;)

7
steffen

Gccバージョン4.7.3を使用してubuntu 13.04で定義なしで機能しているようです

3
bjackfly

ソースコードの上に_GLIBCXX_USE_NANOSLEEPを定義する必要があります。

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

または、次のcommamdでコンパイルします。

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