web-dev-qa-db-ja.com

_GLIBCXX_USE_NANOSLEEPとは何ですか?

_GLIBCXX_USE_NANOSLEEPと呼ばれるプリプロセッサマクロは、2つの標準ヘッダーファイルに表示されます。

  • c ++/4.7.1/x86_64-unknown-linux-gnu/bits/c ++ config.h
  • c ++/4.7.1/thread

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()関数とマクロの間には本当に関係がありますか? ctime/_time.h_でのnanosleep()の宣言は、マクロに依存したり、マクロを定義したりしていないようです。
  • 自分のヘッダーファイルでマクロを定義すること、またはコマンドラインで_-D_オプションとして定義することに関連する特定のリスクはありますか( この関連する質問 で提案されています)? nanosleep()が使用できないシステムでこれを行うとどうなりますか?実際に確認するにはどうすればよいですか?

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

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

ただし、Jonathanの回答に記載されているGCC4.8および4.9の詳細に注意してください。

44
jogojapan

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

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

  • この投稿で提案されているように、デフォルトでこのマクロをアクティブ化するために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()はデフォルトでチェックされますが、まだ作業する時間がありません。

更新:--enable-libstdcxx-timeなしでGCC4.8をビルドしても、std::this_thread::yield()が定義されるようにいくつかの変更をコミットしました(いいえとして) -op)そしてstd::this_thread::sleep_for()の代わりに低解像度のstd::this_thread::sleep_until()および::sleep()関数を使用して::usleep()および::nanosleep()を実装します。ただし、--enable-libstdcxx-timeを定義することをお勧めします。

別の更新:GCC 4.9.0がリリースされ、既知のプラットフォームでnanosleepsched_yieldが自動的に有効になるようになりました。それらをサポートします。 --enable-libstdcxx-timeを使用する必要はなくなりました。

71
Jonathan Wakely