根据使用的 sleep 机制,以下程序的运行方式有所不同。
#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 不会阻止其他程序运行。从我看到的
Sleep
来看,它们阻止了其他任务的运行。我的问题是:
a)PPL线程池如何做一个巧妙的技巧,使它能够解决
sleep_for
(我认为这是一个告诉OS的系统调用(将这个线程放置在非 Activity 线程列表中x秒钟)b)我在这里看到的带有
sleep_for
的行为是否得到保证(又是否定义为我不会获得与ojit_code相同的行为) 最佳答案
在Microsoft VC++ 2012上,基于具有Concurrency Runtime(ConcRT)的cooperative and work-stealing scheduler实现C++标准线程库和PPL。
因此ConcRT调度程序可以巧妙地处理包括std::this_thread::sleep_for
在内的任务。
也许没有。 Sleep
是 native WinAPI,我想ConRT调度程序不能协同处理它。
旁注:Microsoft在Windows 7/Server 2008 R2 64位版本上说ConcRT use User-mode scueduling(UMS)。在这样的平台上,行为可能会改变...