6

ループがあり、ループごとに (ほぼ) 一定の時間実行されるようにしたいと考えています。

私はsleep_forこの動作を実現するために を使用していますが、標準のスレッド ライブラリを完全にサポートしていない環境でもプログラムをコンパイルできるようにしたいと考えています。今、私はこのようなものを持っています:

using namespace std;
using namespace std::chrono;

//
while( !quit )
{
    steady_clock::time_point then = steady_clock::now();

    //...do loop stuff

    steady_clock::time_point now = steady_clock::now();
#ifdef NOTHREADS
    // version for systems without thread support
    while( duration_cast< microseconds >( now - then ).count() < 10000 )
    {
        now = steady_clock::now();
    }

#else
    this_thread::sleep_for( microseconds{ 10000 - duration_cast<microseconds>( now - then ).count() } );
#endif

}

これにより、標準スレッドをサポートしない環境でプログラムをコンパイルできますが、プログラムは時間条件が true になるまで待機するのではなく、継続的にチェックするため、CPU を非常に集中的に使用します。

私の質問は次のとおりです。スレッドを完全にサポートしていない環境で標準 C++ のみを使用して (つまり、boost でなく)、この「待機」動作を有効にするリソース集約型の方法はありますか?

4

1 に答える 1

2

多くの時間ベースの関数があり、使用しているオペレーティング システムに大きく依存します。

Microsoft API は、ミリ秒のスリープを提供する Sleep() (大文字の S) を提供します。

Unix (POSIX) では nanosleep() があります。

これらの 2 つの関数を使用すると、ほとんどのコンピューターで実行できるようになるはずです。

実装は同じループを使用することですが、while() ループ内で少しスリープします。それはまだプールのようなものになりますが、より高速で CPU への負荷がはるかに少なくなります。

また、nm が述べたように、select() にはその機能があります。実装はもう少し複雑ですが、時間が経過すると元に戻ることが期待されます。

于 2013-06-27T03:18:22.593 に答える