2

假设我们有一个类:

class Foo
{
private:
 Concurrency::task_group _tasks;  
};

如何将调度程序分配给此 task_group?我不想使用默认调度程序,因为我还在代码的其他地方使用了 parallel_for。

task_group 将通过调度程序设置其最大并发级别,以根据小时使用所有内核或它们的子集。应用程序可能会运行数小时,因此需要更改 maxconcurrency。

我在 PPL 中找不到这样做的好方法。在 .NET 中,这很容易——您所要做的就是设置 MaxDegreeOfParallelism。

有任何想法吗?

4

1 回答 1

2

有几种解决方案:

  1. 如果您使用 MSVS C++ 2012,则:

    _tasks.run([]()
    {
        Context::Oversubscribe(true);
        //
        // long time running task
        //
       Context::Oversubscribe(false);
    });
    
  2. 如果您的 APP 在 Win7x64 或 Windows Server 2008 R2 上运行,请尝试UMS

    Scheduler::SetDefaultSchedulerPolicy( SchedulerPolicy(1, SchedulerKind, UmsThreadDefault) );
    
  3. 最后。在创建新的繁重时间任务之前,使用新的超额订阅策略(放大 MaxConcurrency)创建新的当前调度程序。

    CurrentScheduler::Create( SchedulerPolicy(1, MaxConcurrency, 8) );
    _tasks.run([](){
        //
        // long time running task
        //
     });
    CurrentScheduler::Detach();
    
于 2012-11-02T15:45:18.183 回答