最終更新日時: 2026年06月15日 14時22分22秒 (JST)
Akira Takahashi が更新

履歴 編集

macro
<ctime>

# TIME_THREAD_ACTIVE(C++26)

    #define TIME_THREAD_ACTIVE implementation-defined

## 概要

呼び出しスレッドの処理時間 (CPU時間) ベースであることを指定するための整数定数値。処理系定義のオプションのマクロである。

このベース時間を`timespec_get()`に指定した場合、呼び出しスレッドに関連する処理時間を取得する。

処理系がスレッドをサポートしない場合、このマクロは定義されない。定義される場合、その値は`TIME_UTC`・`TIME_MONOTONIC`・`TIME_ACTIVE`とは異なる。

C23で`<time.h>`に追加されたマクロであり、C++26で`<ctime>`に取り込まれた。

## 備考

- このベース時間は呼び出しスレッドが実際にCPUで処理を行った時間 (active processing time) であり、実時間 (wall-clock time) ではない。スリープやブロッキングで待機している間の時間は計測に含まれない
- スレッドごとに別個の値であり、あるスレッドで取得した値を別のスレッドで`timespec_get()`・`timespec_getres()`のベース引数として使用してはならない

## 例

    #include <ctime>
    #include <thread>
    #include <print>

    void worker()
    {
      std::timespec t1;
      std::timespec_get(&t1, TIME_THREAD_ACTIVE);

      // このスレッドで実際に計算を行う (スリープでは処理時間は増えない)
      volatile long sum = 0;
      for (long i = 0; i < 100'000'000; ++i) {
        sum += i;
      }

      std::timespec t2;
      std::timespec_get(&t2, TIME_THREAD_ACTIVE);

      // このスレッドが計算に費やしたCPU処理時間が計測される
      // (秒の差) + (ナノ秒の差を秒に変換)。1秒は1'000'000'000ナノ秒
      double sec = (t2.tv_sec - t1.tv_sec) + (t2.tv_nsec - t1.tv_nsec) / 1'000'000'000.0;
      std::println("{:.3f}", sec);
    }

    int main()
    {
      std::thread th{worker};
      th.join();
    }

### 出力例

    0.123

## バージョン

### 言語

- C++26

### 処理系

- Clang: 22 ❌
- GCC: 16.1 ❌
- Visual C++: 2026 Update 2 ❌

## 関連項目

- `timespec_get()`: 指定したベース時間に基づいた、経過秒と経過ナノ秒を取得する
- `TIME_ACTIVE`: プログラム全体の処理時間ベースであることを指定する

## 参照

- P3348R4 C++26 should refer to C23 not C17
  - C++26がC23を参照するようになり、このマクロが`<ctime>`に追加された