辞書マッピング pthread_t
を作成することで、これを自分で実装できます。 std::string
まで 、次に pthread_self() の結果を、現在のスレッドに割り当てる名前に関連付けます。その場合、複数のスレッドが辞書を同時に変更するのを防ぐために、ミューテックスまたはその他の同期プリミティブを使用する必要があることに注意してください (辞書の実装が既にこれを行っている場合を除きます)。現在のスレッドの名前を保存するために、スレッド固有の変数 (pthread_key_create、pthread_setspecific、pthread_getspecific、および pthread_key_delete を参照) を使用することもできます。ただし、そうすると、他のスレッドの名前にアクセスできなくなります (一方、辞書を使用すると、任意のスレッドのすべてのスレッド ID/名前のペアを反復処理できます)。
glibc v2.12 以降、 pthread_setname_np
を使用できます と pthread_getname_np
スレッド名を設定/取得します。
これらのインターフェースは、他のいくつかの POSIX システム (BSD、QNX、Mac) でわずかに異なるさまざまな形式で利用できます。
名前の設定は次のようになります:
#include <pthread.h> // or maybe <pthread_np.h> for some OSes
// Linux
int pthread_setname_np(pthread_t thread, const char *name);
// NetBSD: name + arg work like printf(name, arg)
int pthread_setname_np(pthread_t thread, const char *name, void *arg);
// FreeBSD & OpenBSD: function name is slightly different, and has no return value
void pthread_set_name_np(pthread_t tid, const char *name);
// Mac OS X: must be set from within the thread (can't specify thread ID)
int pthread_setname_np(const char*);
そして、名前を取り戻すことができます:
#include <pthread.h> // or <pthread_np.h> ?
// Linux, NetBSD:
int pthread_getname_np(pthread_t th, char *buf, size_t len);
// some implementations don't have a safe buffer (see MKS/IBM below)
int pthread_getname_np(pthread_t thread, const char **name);
int pthread_getname_np(pthread_t thread, char *name);
// FreeBSD & OpenBSD: dont' seem to have getname/get_name equivalent?
// but I'd imagine there's some other mechanism to read it directly for say gdb
// Mac OS X:
int pthread_getname_np(pthread_t, char*, size_t);
ご覧のとおり、POSIX システム間で完全に移植できるわけではありませんが、linux 全体でわかる限りでは それは一貫している必要があります。 Mac OS X (スレッド内からしか実行できない) を除けば、他のものは少なくともクロスプラットフォーム コードに簡単に適応できます。
ソース:
- glibc NEWS (2.12 の新しいインターフェースについて言及)
- glibc nptl/ChangeLog (2.12 の新しいインターフェースについて言及)
- MKS セット名/取得名
- IBM setname / getname
/Developer/SDKs/MacOSX10.7.sdk/usr/include/pthread.h
からの Mac OS X- QNX セット名/取得名
- FreeBSD setname / 私が見る限り getname はありません
- OpenBSD setname / 私が見る限り getname はありません
- NetBSD setname / getname
prctl(2)
を使用 オプション PR_SET_NAME
を使用した関数 (ドキュメントを参照してください)。
古いバージョンのドキュメントは少しわかりにくいことに注意してください。彼らは言う
<ブロック引用>呼び出しプロセスのプロセス名を設定します
ただし、Linux ではスレッドは軽量プロセス (LWP) であるため、この場合は 1 つのスレッドが 1 つのプロセスになります。
ps -o cmd
でスレッド名が表示されます または:
cat /proc/$PID/task/$TID/comm
または ()
の間 cat /proc/$PID/task/$TID/stat
の :
4223 (kjournald) S 1 1 1 0...
または GDB info threads
から 二重引用符の間:
* 1 Thread 0x7ffff7fc7700 (LWP 6575) "kjournald" 0x00007ffff78bc30d in nanosleep () at ../sysdeps/unix/syscall-template.S:84