c++ - PPL - 如何配置 native 线程数?

标签 c++ windows multithreading threadpool ppl

我正在尝试使用 PPL 的 Scheduler 类来管理 PPL 中 native 线程的数量,这是我的代码:

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 个线程,仍然不正确。如果我等待的时间更长,创建的线程将会更多。

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

最佳答案

已经证明我不应该在任务主体内执行concurrency::wait,PPL在工作窃取模式下工作,当当前任务被wait挂起时,它将开始调度队列中剩余的任务,以最大限度地利用计算资源。

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

此外,SchedulePolicy 可用于配置 PPL 可用于处理任务的虚拟处理器数量,该数量并不总是与 PPL 将创建的 native 线程数量相同。

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

关于c++ - PPL - 如何配置 native 线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40735170/

相关文章:

c++ - Intel HD 3000 上正确的 OpenGL 初始化是什么?

c - Windows 生成文件 : generate debug information

multithreading - 生产者消费者同步只有 1 个信号量

c++ - 如何将小写字符更改为大写字符?

windows - cmd 文件名作为 cmd.exe 中的命令

java - 如何停止一个方法直到我得到java中的响应?

python - 使用python从USB输入线程(麦克风)捕获一个音频样本

c++ - 如何在 C++ 中初始化一个空的全局 vector

c++ - 访问结构内的列表时出现段错误

c++ - 如何在 Win32 窗口中实现 MFC 资源?