C 言語でスレッド ID を取得する

胡金庫 2023年10月12日
  1. C 言語でスレッド ID を取得するには pthread_self 関数を使用する
  2. gettid 関数を使って C 言語のスレッド ID を取得する
  3. 関数 thrd_current を用いて C 言語のスレッド ID を取得する方法
C 言語でスレッド ID を取得する

この記事では、C 言語でスレッド ID を取得する方法について複数の方法を紹介します。

C 言語でスレッド ID を取得するには pthread_self 関数を使用する

スレッドは、最近の CPU では、より優れたマルチスレッドワークフローをサポートするために、仮想コアや物理コアを追加する傾向があるため、現代の CPU のパフォーマンスの要となっています。一般的に、スレッドはプロセス(すなわち、実行中のプログラム)の中の制御の単一のフローとして定義されます。したがって、スレッドは複数のロジックフローを実装するために使用され、同時に実行され、複数の CPU コアを利用したプログラムを形成します。POSIX のスレッドは、C プログラムでスレッド機能にアクセスするための最も古い標準インターフェースであることに注意してください。pthread_self は、pthreads API が提供する関数の一つで、呼び出し元のスレッドの ID を取得することができます。引数を 0 個取り、スレッド ID を表す整数を pthread_t 型変数として返します。

以下の例では、メインプログラム(スレッド)がさらに 4つのスレッドを生成し、printHello 関数を実行し、pthread_exit 関数呼び出しを用いて終了する基本的なマルチスレッドシナリオを実装しています。このプログラムでは 5つのスレッドが実行されており、与えられたコードパスが実行された後にすべて終了していることに注意してください。printHello 関数では、pthread_self 関数を使ってスレッド ID を表示しています。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef NUM_THREADS
#define NUM_THREADS 4
#endif

void *printHello(void *threadid) {
  long tid;
  tid = (long)threadid;
  printf("Hello There! thread %ld, pthread ID - %lu\n", tid, pthread_self());
  pthread_exit(NULL);
}

int main(int argc, char const *argv[]) {
  pthread_t threads[NUM_THREADS];
  int rc;
  long t;

  for (t = 0; t < NUM_THREADS; t++) {
    rc = pthread_create(&threads[t], NULL, printHello, (void *)t);
    if (rc) {
      printf("ERORR; return code from pthread_create() is %d\n", rc);
      exit(EXIT_FAILURE);
    }
  }
  pthread_exit(NULL);
}

出力:

Hello There! thread 1, pthread ID - 140388002486016
Hello There! thread 0, pthread ID - 140388010878720
Hello There! thread 2, pthread ID - 140387994093312
Hello There! thread 3, pthread ID - 140387985700608

gettid 関数を使って C 言語のスレッド ID を取得する

gettid は C プログラムの関数ラッパーを用いて提供される Linux 固有のシステムコールであり、呼び出し元のスレッド ID を返す。この関数は pthread_self と同様に引数を取らず、pid_t 型の整数値を返す。この関数は pthread_self と同様に引数を取らず、pid_t 型の整数値を返す。プログラムがシングルスレッドの場合、gettidgetpid と同じ値、つまりプロセス ID と同じ値を返します。

#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef NUM_THREADS
#define NUM_THREADS 4
#endif

void *printHello(void *threadid) {
  long tid;
  tid = (long)threadid;
  printf("Hello There! thread %ld, kthread ID - %d\n", tid, gettid());
  pthread_exit(NULL);
}

int main(int argc, char const *argv[]) {
  pthread_t threads[NUM_THREADS];
  int rc;
  long t;

  for (t = 0; t < NUM_THREADS; t++) {
    rc = pthread_create(&threads[t], NULL, printHello, (void *)t);
    if (rc) {
      printf("ERORR; return code from pthread_create() is %d\n", rc);
      exit(EXIT_FAILURE);
    }
  }
  pthread_exit(NULL);
}

出力:

Hello There! thread 0, kthread ID - 10389
Hello There! thread 1, kthread ID - 10390
Hello There! thread 2, kthread ID - 10391
Hello There! thread 3, kthread ID - 10392

関数 thrd_current を用いて C 言語のスレッド ID を取得する方法

thrd_current は、2011 年に標準言語仕様に追加された ISO C threads API の一部です。この API は POSIX 互換のオペレーティングシステムや標準準拠の C コンパイラを提供するプラットフォームに標準的なインターフェイスを提供することに注意してください。したがって、このメソッドは C 言語のスレッドと対話するための推奨される方法です。以下の例では、スレッドの作成と終了に pthread 関数を利用しているが、プロジェクトで作業する際には単一のインターフェイス(Pthreads または ISO C)を選択すべきです。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <threads.h>
#include <unistd.h>

#ifndef NUM_THREADS
#define NUM_THREADS 4
#endif

void *printHello(void *threadid) {
  long tid;
  tid = (long)threadid;
  printf("Hello There! thread %ld, pthread ID - %lu\n", tid, thrd_current());
  pthread_exit(NULL);
}

int main(int argc, char const *argv[]) {
  pthread_t threads[NUM_THREADS];
  int rc;
  long t;

  for (t = 0; t < NUM_THREADS; t++) {
    rc = pthread_create(&threads[t], NULL, printHello, (void *)t);
    if (rc) {
      printf("ERORR; return code from pthread_create() is %d\n", rc);
      exit(EXIT_FAILURE);
    }
  }
  pthread_exit(NULL);
}

出力:

Hello There! thread 0, pthread ID - 139727514998528
Hello There! thread 1, pthread ID - 139727506605824
Hello There! thread 2, pthread ID - 139727498213120
Hello There! thread 3, pthread ID - 139727489820416
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C Thread