根据使用的 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的行为是否得到保证(又是否定义为我不会获得与oj​​it_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)。在这样的平台上,行为可能会改变...

09-06 22:31