タスクは、特定のスレッドで実行されるワークの論理単位です。タスクは入れ子にできます。そのため、通常、タスクは関数、スコープ、または switch 文の case ブロックに対応します。タスクをスレッドに割り当てるためタスク API を使用できます。
タスク API は再開状態で動作するスレッド単位の関数です。この関数はポーズ状態では動作しません。
タスク API は、スレッドが現在のタスクをサスペンドしたり、異なるタスクに切り替えたり (タスクスイッチ)、またはタスクを異なるスレッドに移行 (タスクスチール) することはありません。
タスクのインスタンスは、ある期間に特定のスレッドが実行するワークに相当します。タスクは同一スレッド内で __itt_task_begin() と __itt_task_end() で囲むことで定義します。
結果にユーザータスクを表示するには、[解析の設定] で [ユーザータスクの解析] チェックボックスをオンにします。
スレッドのタスク・インスタンスを作成します。これは、スレッドのその時点のタスク・インスタンスとなります。同じスレッドで __itt_task_end() を呼び出すとタスク・インスタンスは終了します。
void __itt_task_begin (const __itt_domain *domain,__itt_id taskid, __itt_id parentid, __itt_string_handle *name)
現在のタスクの終了をトレースします。
void __itt_task_end (const __itt_domain *domain)
次の表は、タスク API プリミティブで使用するパラメーターを定義します。
タイプ | パラメーター |
説明 |
---|---|---|
[in] | __itt_domain |
タスクのドメイン。 |
[in] | __itt_id taskid |
予約済みのパラメーター。 |
[in] | __itt_id parentid |
予約済みのパラメーター。 |
[in] | __itt_string_handle |
タスク文字列のハンドル。 |
タスク API を使用するには、次の手順に従ってください。
次のコードは、グローバルスコープでドメインと 2 つのタスクを生成します。
#include "ittnotify.h"
void do_foo(double seconds);
__itt_domain* domain = __itt_domain_create("MyTraces.MyDomain");
__itt_string_handle* shMyTask = __itt_string_handle_create("My Task");
__itt_string_handle* shMySubtask = __itt_string_handle_create("My SubTask");
void BeginFrame() {
__itt_task_begin(domain, __itt_null, __itt_null, shMyTask);
do_foo(1);
}
void DoWork() {
__itt_task_begin(domain, __itt_null, __itt_null, shMySubtask);
do_foo(1);
__itt_task_end(domain);
}
void EndFrame() {
do_foo(1);
__itt_task_end(domain);
}
int main() {
BeginFrame();
DoWork();
EndFrame();
return 0;
}
#ifdef _WIN32
#include <ctime>
void do_foo(double seconds) {
clock_t goal = (clock_t)((double)clock() + seconds * CLOCKS_PER_SEC);
while (goal > clock());
}
#else
#include <time.h>
#define NSEC 1000000000
#define TYPE long
void do_foo(double sec) {
struct timespec start_time;
struct timespec current_time;
clock_gettime(CLOCK_REALTIME, &start_time);
while(1) {
clock_gettime(CLOCK_REALTIME, ¤t_time);
TYPE cur_nsec=(long)((current_time.tv_sec-start_time.tv_sec-sec)*NSEC + current_time.tv_nsec - start_time.tv_nsec);
if(cur_nsec>=0)
break;
}
}
#endif