Следующая программа работает по-разному в зависимости от используемого механизма сна.Microsoft VC++ PPL и сон
#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
из того, что я вижу, они блокируют выполнение дальнейших задач.
Мои вопросы:
а) как можно PPL пул потоков сделать умный трюк, который позволяет ему обойти sleep_for
(я думал, что это системный вызов, который говорит ОС (поместить эту тему в список неактивных потоков для х секунды)
б) является ли поведение Im видит здесь с sleep_for
гарантированными (иначе это определенно, что я не буду получать такое же поведение, как с Sleep
)
См. Также раздел «Координация задач с совместной блокировкой». http://msdn.microsoft.com/en-us/library/gg663529.aspx –