C 言語でスレッド ID を取得する
-
C 言語でスレッド ID を取得するには
pthread_self
関数を使用する -
gettid
関数を使って C 言語のスレッド ID を取得する -
関数
thrd_current
を用いて 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
型の整数値を返す。プログラムがシングルスレッドの場合、gettid
は getpid
と同じ値、つまりプロセス 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