如何告诉c++;并发运行时重用上一个线程进行任务继续 我使用VisualC++并发运行时创建任务,然后在它的上安排了四个连续性。 #include <iostream> #include <thread> #include <ppltasks.h> int main() { concurrency::create_task([] { std::cout << std::this_thread::get_id() << std::endl; }) .then([] { std::cout << std::this_thread::get_id() << std::endl; }) .then([] { std::cout << std::this_thread::get_id() << std::endl; }) .then([] { std::cout << std::this_thread::get_id() << std::endl; }) .then([] { std::cout << std::this_thread::get_id() << std::endl; }); std::cin.get(); }

如何告诉c++;并发运行时重用上一个线程进行任务继续 我使用VisualC++并发运行时创建任务,然后在它的上安排了四个连续性。 #include <iostream> #include <thread> #include <ppltasks.h> int main() { concurrency::create_task([] { std::cout << std::this_thread::get_id() << std::endl; }) .then([] { std::cout << std::this_thread::get_id() << std::endl; }) .then([] { std::cout << std::this_thread::get_id() << std::endl; }) .then([] { std::cout << std::this_thread::get_id() << std::endl; }) .then([] { std::cout << std::this_thread::get_id() << std::endl; }); std::cin.get(); },c++,multithreading,visual-studio-2013,concurrency-runtime,C++,Multithreading,Visual Studio 2013,Concurrency Runtime,请注意,这4个连续任务与初始任务不在同一线程上调度。有没有一种方法可以将延续安排在与初始任务相同的线程上?我相信这在c#中是可能的,通过使用option。通常,您可以使用task\u continuation\u context控制continuations执行的上下文,如下所示。然而,同样的文件也提到: 只能从Windows应用商店应用程序使用此类。对于非Windows应用商店应用,任务延续的执行上下文由运行时确定,不可配置 从您的代码片段可以看出,当您使用并发运行时时,您并不是在Window

请注意,这4个连续任务与初始任务不在同一线程上调度。有没有一种方法可以将延续安排在与初始任务相同的线程上?我相信这在c#中是可能的,通过使用option。

通常,您可以使用
task\u continuation\u context
控制continuations执行的上下文,如下所示。然而,同样的文件也提到:

只能从Windows应用商店应用程序使用此类。对于非Windows应用商店应用,任务延续的执行上下文由运行时确定,不可配置

从您的代码片段可以看出,当您使用并发运行时时,您并不是在Windows应用商店应用程序中使用它。因此,上下文实际上总是任意的


还有一个问题是,为什么要在与第一个任务相同的线程上显式运行后续任务:那么,为什么不将这些任务的代码放在第一个任务中呢?继续的要点是回到一个特定的线程,以便继续在后台任务中完成的工作——这意味着,第一个任务必然是您希望做的后台工作,并且继续是从主线程开始对该工作作出反应。如果你想留在后台线程上,那么就呆在那里,不要费心把这项工作放在继续中。(但是,如上所述,由于这不是Windows应用商店应用程序,所有这些延续和任务都在任意上下文中运行;运行时只会选择一个方便的可用线程。)

像并发运行时这样的事情的主要目的是避免处理诸如明确决定哪些任务在哪些线程上运行之类的细节。您应该指定面向结果的约束(如对排序的要求),并让运行时处理细节。@JerryCoffin虽然我大体上同意您的观点,但我可以看出人们希望这样做的原因;根据平台的不同,线程创建可能会有任意开销。无法强制运行时将后续任务调度到同一线程会导致它在某些用例中不可用。@JonasWielicki:您考虑过在任务之间使用虚拟变量吗?这可能会导致运行时使用单个线程来避免在线程之间传递对象。
29432
29432
25096
25668
42488