0

次の例を検討してください。Windows 7 icore7ラップトップ(VC ++ 2010)およびubuntu 64ビット12.04 lte gcc 4.6.3で

#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread/thread.hpp>
typedef boost::posix_time::ptime Time;
typedef boost::posix_time::time_duration TimeDuration;
int main()
{
    Time t1;
    Time t2;
    TimeDuration dt;
    boost::posix_time::microseconds tosleep=boost::posix_time::microseconds(100);
    for(int i=0;i<10;i++){

        t1=boost::posix_time::microsec_clock::local_time();
        //std::cout <<i << std::endl; // on win7 without this all outputs are 0
        boost::this_thread::sleep( tosleep );

        t2=boost::posix_time::microsec_clock::local_time();

        dt = t2 - t1;
        long long msec = dt.total_microseconds();
        std::cout << msec << std::endl;
    }
    return 0;
}

スレッドが常に 100 マイクロ秒スリープすることを期待していましたが、出力は何か変です:

=========== AND OUTPUT ==================
arm2arm@cudastartub:~$ g++ -O3 sleepme.cpp -lboost_thread
arm2arm@cudastartub:~$ ./a.out
726
346
312
311
513
327
394
311
306
445

ブーストにはオーバーヘッドがありますか?マイクロ秒が重要なリアルタイム システムには何が必要ですか?

4

1 に答える 1

0

Windows では、1 ミリ秒未満で Sleep() を実行できないため、sleep(tosleep) 呼び出しは sleep(0) と同等です。(このリンクも参照してください)

もちろんstd::cout <<i << std::endl時間はかかりますが…

于 2012-06-13T08:52:23.397 に答える