2个不同的task_group实例未并行运行任务

时间:2011-12-06 12:33:22

标签: c++ windows concurrency

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

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

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

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

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

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

仅在我的应用程序中发生这种情况,其中任务是从静态函数启动的。我在测试应用程序中执行了相同的操作,并且任务正在并行运行。

花了几个小时试图解决这个问题之后,我又回到了正常的线程。

有谁知道为什么并发运行时会出现这种行为,或者我怎么能避免这种行为?

修改 问题是它在单核CPU上运行,并发运行时查看吞吐量。我想知道微软并行模式库是否具有活动对象的概念,或者行上的某些内容,以便您可以指定您要进行午餐的任务与您从其启动它的线程并行执行... < / p>

1 个答案:

答案 0 :(得分:0)

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

对于一台核心机器,这是预期的“默认”行为。这可以改变。

默认情况下,可并行运行的任务数=硬件线程数(核心数)。这改善了完成任务的原始通道和效率。

但是,在许多情况下,无论核心数量多少,开发人员都希望并行运行许多任务。在这种情况下,您有两个选择:

  1. Oversubsribe在当地。
  2. 在上面的示例中,您将使用

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

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

      SetDefaultSchedulerPolicy(策略);