3

C++ ppl ライブラリから新しく作成されたタスクは自動的に実行されますか、または前述のタスクの実行を開始するために必要なメカニズムはありますか?

4

3 に答える 3

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 スレッドプールに送信されます。はい、タスクはすぐにスケジュールされます。

于 2017-01-08T16:22:17.787 に答える
0

タスクを開始するために何もする必要はありません。

次のようなコードを試してください。

#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 ワーカー スレッドを作成したことがわかります。

于 2017-01-08T15:35:30.067 に答える