【问题标题】:2 different task_group instances not running tasks in parallel2 个不同的 task_group 实例未并行运行任务
【发布时间】:2011-12-13 22:24:56
【问题描述】:

我想用 ppl 的 task_group 类替换普通线程的使用,但我遇到了以下问题:

  • 我有一个带有 task_group 成员的 A 类,

  • 创建 2 个不同的 A 类实例,

  • 在第一个A实例的task_group中启动一个任务(使用run),

  • 几秒钟后,在第二个 A 实例的 task_group 中启动一个任务。

我希望这两个任务并行运行,但第二个任务等待第一个任务完成然后开始。

这仅在我的应用程序中发生,其中任务从静态函数启动。我在测试应用程序中执行了相同的场景,并且任务并行正确运行。

花了几个小时试图弄清楚这一点后,我切换回了正常线程。

有谁知道为什么并发运行时会出现这种行为,或者我该如何避免这种情况?

编辑 问题在于它在单核 CPU 上运行,并发运行时着眼于吞吐量。我想知道微软并行模式库是否具有活动对象的概念,或者在线上的某些东西,以便您可以指定您将要吃午饭的任务将与您启动它的线程并行执行......

【问题讨论】:

    标签: c++ windows concurrency


    【解决方案1】:

    可以在这里找到回复:http://social.msdn.microsoft.com/Forums/en/parallelcppnative/thread/85a84373-4c3d-4862-bff3-9a21ffe82493

    对于单核机器,这是预期的“默认”行为。这可以更改。

    默认情况下,可以并行运行的任务数 = 硬件线程数(内核数)。这提高了完成任务的原始吞吐量和效率。

    但是,在许多情况下,开发人员希望许多任务并行运行,而不管内核数量如何。在这种情况下,您有两种选择:

    1. 本地超额订阅。

    在上面的示例中,您将使用

    void lengthyTask()
    
    {
    
        Context::Oversubscribe(true)
    
             ...do a lengthy task  (//OR a blocking task)
    
        Context::Oversubscribe(false)
    
    }
    
    1. 启动应用程序时过度订阅调度程序。

      SchedulerPolicy 策略(1, MaxConcurrency, GetProcessorCount() * 2);

      SetDefaultSchedulerPolicy(策略);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多