最近、現在のスレッドを正確な期間スリープする必要があることに気付きました。 POSIXプラットフォームでこれを行うには、nanosleep()
を使用する方法とboost::this_thread::sleep()
を使用する方法の2つを知っています。
何よりも好奇心から、2つのアプローチの違いは何だろうと思っていました。精度に違いはありますか?また、ブーストアプローチを使用する理由はありますかnot?
nanosleep()
アプローチ:
#include <time.h>
...
struct timespec sleepTime;
struct timespec returnTime;
sleepTime.tv_sec = 0;
sleepTime.tv_nsec = 1000;
nanosleep(&sleepTime, &returnTime);
ブーストアプローチ:
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread/thread.hpp>
...
boost::this_thread::sleep(boost::posix_time::nanoseconds(1000));
私が考えることができるブーストを使用するいくつかの理由:
boost::this_thread::sleep()
はboost.threadの中断ポイントですboost::this_thread::sleep()
は、将来的にC++ 0xのstd::this_thread::sleep_until()
にドロップインで置き換えることができます。なぜそうではないのか-スレッドをまったく使用していない場合、またはプロジェクト内の他のすべてのものがPOSIX呼び出しを使用している場合は、nanosleep()
の方が理にかなっています。
精度に関しては、私のシステムでは、boostとnanosleep()の両方が同じシステムコールhrtimer_nanosleep()
を呼び出します。ブーストの作者は各システムで可能な限り最高の精度を得ようとしていると思いますが、私にとってはnanosleep()
が提供するものと同じです。
Nanonsleepの例が間違っているのでどうですか。
_#include <time.h>
...
struct timespec sleepTime;
struct timespec time_left_to_sleep;
sleepTime.tv_sec = 0;
sleepTime.tv_nsec = 1000;
while( (sleepTime.tv_sec + sleepTime.tv_nsec) > 0 )
{
nanosleep(&sleepTime, &time_left_to_sleep);
sleepTime.tv_sec = time_left_to_sleep.tv_sec;
sleepTime.tv_nsec = time_left_to_sleep.tv_nsec;
}
_
確かに、1マイクロ秒しか眠っていない場合、目覚めが早すぎることは問題ではありませんが、一般的な場合、これがそれを行う唯一の方法です。
そして、ブーストのためにケーキを氷結させるために、boost::this_thread::sleep()
はnanosleep()
を使用して実装されます。彼らはあなたのためにすべての非常識なコーナーケースの世話をしました。
ブーストアプローチを使用しない理由はありますか
これは明らかなことだと思いますが、私が考えることができる唯一の理由は、プロジェクトをコンパイルするためにブーストが必要になるということです。
私にとって、ブーストバリアントを使用する主な理由は、プラットフォームの独立性です。たとえば、posixプラットフォームとWindowsプラットフォームの両方でアプリケーションをコンパイルする必要がある場合、プラットフォームのスリープは十分ではありません。