【问题标题】:Task execution properties in pplppl 中的任务执行属性
【发布时间】:2015-10-22 10:42:54
【问题描述】:

C++ ppl 库中新创建的任务是否会自动执行,或者是否需要任何机制来启动上述任务的执行?

【问题讨论】:

    标签: c++ visual-studio-2015 ppl


    【解决方案1】:

    任务立即安排

    concurrency::task构造函数调用
    _TaskInitMaybeFunctor调用
    _TaskInitWithFunctor<_ReturnType, _Function>调用
    _ScheduleTask调用
    _M_TaskCollection._ScheduleTask调用(除非你已经证明了你自己的调度程序)
    _DefaultPPLTaskScheduler().schedule; 来电
    (new _PPLTaskChore{ _Proc, _Param })->_Schedule; 来电
    _Schedule_chore 来电
    __crtCreateThreadpoolWork + _Reschedule_chore 调用
    __crtSubmitThreadpoolWork 调用
    SubmitThreadpoolWork

    将任务提交到win32线程池。 所以是的,任务立即安排

    【讨论】:

      【解决方案2】:

      您无需执行任何操作即可开始任务。

      试试这样的代码:

      #include "stdafx.h" // Windows.h for Sleep
      #include <ppltasks.h>
      #include <iostream>
      
      using namespace concurrency;
      using namespace std;
      
      int main()
      {
          // Create a task.
          task<int> t([]()
          {
              cout << "Task Running\n";
              return 42;
          });
      
          cout << "Task created\n";
          Sleep(5000L);
      }
      

      你会在控制台输出中看到这个,之前程序退出:

      Task Created
      Task Running
      

      如果没有 Sleep() 程序将立即退出并破坏任务。 除了 Sleep() 之外,您还可以进行一些 CPU 密集型操作,比如在循环中设置一个循环,以防止程序立即退出。或者只是添加:

      std::cin.get();
      

      结果是一样的。 您不需要调用 get() 或 wait(),但是,如果您想捕获异常或处理取消,则需要添加延续。 调试时,您可以启动 Parallel Stacks 窗口,您会看到 Task Scheduler 除了主线程外,还创建了 TPP 工作线程。

      【讨论】:

      • 会不会在“Task Created”之前打印“Task Running”?
      【解决方案3】:

      不,它不会自动启动:

      #include <ppltasks.h>
      #include <iostream>
      
      using namespace concurrency;
      using namespace std;
      
      int wmain()
      {
          // Create a task.
          task<int> t([]()
          {
              cout << "Task Running" << endl;
              return 42;
          });
      
          cout << "Task created " << endl;
      
          wcout << "The result is " <<  t.get() << endl;    
      }
      

      以上代码的输出将是

      已创建任务
      任务运行
      结果是 42

      如果你注释掉t.get(),任务根本不会运行。也可以使用t.wait()强制执行任务。

      【讨论】:

      • #SingerOfTheFall 那么如何以非阻塞方式开始一项任务呢?据我所知,get 和 wait 会阻塞任务正在运行的线程。
      • @DavidHaim 是的,没有 t.get() 程序在很多事情发生之前就退出了。顺便说一句,大卫,与此无关,我已经看到你的 cmets 关于 C++ REST 如何非常慢。您是否有任何问题可以提供更多详细信息,如果没有,您能否提出要问的问题以便添加一些详细信息?谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      相关资源
      最近更新 更多