首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PPL -如何配置本地线程的数量?

PPL -如何配置本地线程的数量?
EN

Stack Overflow用户
提问于 2016-11-22 14:28:45
回答 1查看 774关注 0票数 2

我正在尝试使用它的Scheduler类来管理PPL中的本机线程数,下面是我的代码:

代码语言:javascript
复制
for (int i = 0; i < 2000; i ++)
{
    // configure concurrency count 16 to 32.
    concurrency::SchedulerPolicy policy = concurrency::SchedulerPolicy(2, concurrency::MinConcurrency, 16, 
            concurrency::MaxConcurrency, 32);
    concurrency::Scheduler *pScheduler = concurrency::Scheduler::Create(policy);
    HANDLE hShutdownEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    pScheduler->RegisterShutdownEvent(hShutdownEvent);
    pScheduler->Attach();

    //////////////////////////////////////////////////////////////////////////

    //for (int i = 0; i < 2000; i ++)
    {
        concurrency::create_task([]{
            concurrency::wait(1000);
            OutputDebugString(L"Task Completed\n");
        });
    }

    //////////////////////////////////////////////////////////////////////////

    concurrency::CurrentScheduler::Detach();
    pScheduler->Release();
    WaitForSingleObject(hShutdownEvent, INFINITE);
    CloseHandle(hShutdownEvent);
}

SchedulerPolicy的用法来自MSDN,但它根本不起作用。上面代码的预期结果是,PPL将启动16到32个线程来执行2000个任务,但事实是:

通过观察控制台输出的速度,在一秒钟内只处理了一项任务。我还尝试注释了外部for循环和内部for循环,然而,这将导致创建300个线程,仍然是不正确的。如果我wait更长的时间,创建的线程会更多。

关于在PPL中配置并发性的正确方法有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2016-11-27 15:24:46

事实证明,我不应该在任务体内做concurrency::wait,它工作在工作窃取模式,当当前任务被wait挂起时,它会开始调度队列中的其余任务,以最大限度地利用计算资源。

当我在实际项目中使用concurrency::create_task时,由于任务主体中有几个真实的计算,PPL不会再创建数百个线程。

此外,SchedulePolicy还可以用来配置PPL可以用来处理任务的虚拟处理器的数量,这并不总是与PPL将创建的本机线程的数量相同。

假设我的CPU有8个虚拟处理器,默认情况下,PPL只会在池中创建8个线程,但当其中一些线程被waitlock挂起,并且队列中有更多的待决任务时,PPL会立即创建更多的线程来执行它们(如果虚拟处理器没有完全加载)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40735170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档