我想用 ppl 的 task_group 类替换普通线程的使用,但我遇到了以下问题:
我有一个 task_group 成员的 A 类,
创建类 A 的 2 个不同实例,
在第一个A实例的task_group中启动一个任务(使用run),
几秒钟后,在第二个 A 实例的 task_group 中启动一个任务。
我希望这两个任务并行运行,但第二个任务等待第一个任务完成然后开始。
这只发生在我的应用程序中,任务是从静态函数启动的。我在测试应用程序中执行了相同的场景,并且任务正确并行运行。
在花了几个小时试图解决这个问题后,我切换回了正常的线程。
有谁知道为什么并发运行时会出现这种行为,或者我该如何避免这种情况?
编辑 问题在于它在单核 CPU 上运行,并发运行时着眼于吞吐量。我想知道微软并行模式库是否有事件对象的概念,或者在线上的一些东西,这样你就可以指定你即将吃午饭的任务将与你启动它的线程并行执行......
最佳答案
对于一台核心机器,这是预期的“默认”行为。这可以更改。
默认情况下,可以并行运行的任务数 = 硬件线程数(核心数)。这提高了完成任务的原始吞吐量和效率。
但是,在许多情况下,开发人员希望并行运行许多任务,而不管内核的数量。在这种情况下,您有两种选择:
- 本地超额订阅。
在你上面的例子中,你会使用
void lengthyTask()
{
Context::Oversubscribe(true)
...do a lengthy task (//OR a blocking task)
Context::Oversubscribe(false)
}
启动应用程序时超额订阅调度程序。
SchedulerPolicy 策略(1, MaxConcurrency, GetProcessorCount() * 2);
SetDefaultSchedulerPolicy(政策);
关于c++ - 2 个不同的 task_group 实例不并行运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8399940/