次のプログラムは、使用するスリープ メカニズムに応じて異なる方法で実行されます。
#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
)