45

_GLIBCXX_USE_NANOSLEEP というプリプロセッサ マクロが、次の 2 つの標準ヘッダー ファイルに含まれています。

  • c++/4.7.1/x86_64-unknown-linux-gnu/bits/c++config.h
  • c++/4.7.1/スレッド

GCC 4.7.1 (Linux、64 ビット) のデフォルト ビルドでは、c++config.hに含まれるのは次のコメントだけです。

/* Defined if nanosleep is available. */
/* #undef _GLIBCXX_USE_NANOSLEEP */

一方、threadでは、 と の定義は、定義するマクロstd::this_thread::sleep_for()std::this_thread::sleep_until()依存します。定義されていない場合、両方の関数 (C++ 標準で必要ですが) も定義されません。

私のシステム (glibc 2.15) では、マクロは定義されていませんが、nanosleep()関数 (で宣言されているctime) は存在し、操作可能です。

これが一体何なのか、どう対処すればいいのか知りたいです。具体的には:

  • この投稿で提案されているように、デフォルトでこのマクロをアクティブにするために GCC をビルドするときに使用する必要がある構成オプションはありますか? (ビルド プロセスのオンライン ドキュメントには何も見つかりませんでした。)
  • nanosleep()関数とマクロの間には本当に関係がありますか? nanosleep()in ctime/の宣言はtime.h、マクロに依存または定義していないようです。
  • -D独自のヘッダー ファイルでマクロを定義すること、またはコマンド ラインのオプションとしてマクロを定義することに関連する特定のリスクはありますか(この関連する質問で提案されているように)? が利用できないシステムでこれを行うnanosleep()とどうなりますか?また、実際にどのように確認できますか?

更新GCC 4.8 以降では、 などのサポートstd::this_thread::sleep_for()が libstdc++ に自動的に含まれます。構成フラグはもう必要ありません。GCC 4.8 変更ログから:

this_thread::sleep_for()、this_thread::sleep_until()、および this_thread::yield() は、構成オプション --enable-libstdcxx-time を必要とせずに定義されます。

ただし、ジョナサンの回答に記載されている GCC 4.8 および 4.9 の詳細に注意してください。

4

1 に答える 1

73

libstdc++ がビルドされると、そのconfigureスクリプトはシステムをテストして、サポートされている機能を確認し、その結果に基づいてさまざまなマクロを定義 (または未定義) します。c++config.h

あなたの場合configure、POSIXnanosleep()関数が利用できず、マクロが定義されていないと判断しました。ただし、あなたが言うように、システムnanosleep() 利用できます。有効にされていない理由は、オプションconfigureを使用しない限り、チェックが実行されないためです( GCC 構成ドキュメントではなく、 libstdc++ マニュアルの構成の章に記載されています)。--enable-libstdcxx-time

  • この投稿で提案されているように、デフォルトでこのマクロをアクティブにするために GCC をビルドするときに使用する必要がある構成オプションはありますか? (ビルド プロセスのオンライン ドキュメントには何も見つかりませんでした。)

はい、--enable-libstdcxx-time

  • nanosleep() 関数とマクロの間には本当に関係がありますか? ctime/time.h の nanosleep() の宣言は、マクロに依存または定義していないようです。

glibc の関数の宣言は、libstdc++ のマクロに依存していません。しかし、マクロは関数を使用するかどうかを libstdc++ に指示します。

  • 自分のヘッダー ファイルでマクロを定義すること、またはコマンド ラインの -D オプションとしてマクロを定義することに関連する特定のリスクはありますか (この関連する質問で提案されているように)。nanosleep() が利用できないシステムでこれを行うとどうなりますか? また、実際にどのように確認できますか?

いたずらでサポートされていませんが、動作します。マクロは内部実装の詳細であり、ユーザーではなく構成によって設定する必要があり、実装の内部マクロの定義を変更すると問題が発生する可能性があります。しかし、この場合、依存する唯一のコードがヘッダーにあり、影響を受けるライブラリ コードがないため、そうはなりませんlibstdc++.so

ただし、GCC を再インストールして--enable-libstdcxx-timeオプションを使用するか、それが不可能な場合は編集c++config.hしてマクロを true に定義することをお勧めします。

利用できない別のシステムで定義するとnanosleep()、コンパイル エラーが発生します#include <thread>

その構成を改善するためのアイデアがいくつかあるので、デフォルトでnanosleep()sched_yield()がチェックされますが、まだ作業する時間がありません。

更新: GCC 4.8 をビルドせずに(no-op として) を--enable-libstdcxx-time定義し、代わりに低解像度と関数を実装して使用するように、いくつかの変更をコミットしました。それでも定義したほうがいいです。std::this_thread::yield()std::this_thread::sleep_for()std::this_thread::sleep_until()::sleep()::usleep()::nanosleep()--enable-libstdcxx-time

別の更新: GCC 4.9.0 がリリースされ、デフォルトで自動的に有効にnanosleepなりsched_yield、それらをサポートすることが知られているプラ​​ットフォーム上で動作します。を使用する必要がなくなりました--enable-libstdcxx-time

于 2012-10-18T18:58:21.647 に答える