3

次のプログラムは、使用するスリープ メカニズムに応じて異なる方法で実行されます。

#include <ppltasks.h>
#include <chrono>
#include <thread>
#include <iostream>
#include <atomic>
#include <windows.h>
using namespace std;
#define MODERN_MAN
int main()
{
    atomic<int> cnt;
    concurrency::task_group tg;
    for (int i =0; i<1000; ++i )
    {
        tg.run([&cnt](){cout << "."; cnt++; 
        #ifdef MODERN_MAN
        this_thread::sleep_for(chrono::seconds(5));
        #else
        Sleep(5000);
        #endif
        });
    }
    tg.wait();
    cout << cnt;
    return 0;
}

違いは、sleep_for私が見るものとは、1つのスリープが他の実行を妨げないようにタスクがスケジュールされることです。

Sleep私が見たところ、彼らはそれ以上のタスクの実行をブロックしています。

私の質問は次のとおりです:
a)PPLスレッドプールは、回避策を可能にする巧妙なトリックをどのように行うことができますかsleep_for(OSに通知するシステムコールだと思いました(このスレッドを非アクティブスレッドのリストにx秒間入れます))

b)私がここで見ている動作はsleep_for保証されていますか(別名、と同じ動作をしないと定義されていますSleep

4

3 に答える 3

1

理由の 1 つは、2 つのスリープ方法の精度が異なることです。プラットフォームでテストする必要があることを確認するには、隣接する2つの隣接する2つの間の時間を測定することにより、精度をテストしますSleep(0)Sleep(1)sleep_for()

タイマー値の精度と実際の精度には大きな違いがある可能性があることに注意してください。たとえば、clock() はミリ秒の精度を提供しますが、私のマシンでは、(平均で) 15 ミリ秒の精度があります。

于 2013-04-02T12:05:51.953 に答える