C++ ppl ライブラリから新しく作成されたタスクは自動的に実行されますか、または前述のタスクの実行を開始するために必要なメカニズムはありますか?
3 に答える
タスクはすぐにスケジュールされます。
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 スレッドプールに送信されます。はい、タスクはすぐにスケジュールされます。
タスクを開始するために何もする必要はありません。
次のようなコードを試してください。
#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 ウィンドウを起動すると、タスク スケジューラがメイン スレッドのほかに TPP ワーカー スレッドを作成したことがわかります。