web-dev-qa-db-ja.com

Linux pthreadsでスレッドの名前を設定する方法は?

Linuxでスレッドの名前を設定する方法はありますか?

私の主な目的は、デバッグ中に役立つことと、その名前がたとえば/proc/$PID/task/$TID/...

57
Anonym

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                                                                                  
_
31
Aaron Digulla

Glibc v2.12では、pthread_setname_nppthread_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(スレッド内からしか実行できない)を除き、他のプラットフォームは少なくともクロスプラットフォームコードに簡単に適応できます。

ソース:

102
drfrogsplat

pthread_tstd::stringにマッピングするディクショナリを作成して、これを自分で実装してから、 pthread_self() の結果を現在のスレッドに割り当てる名前に関連付けることができます。 。それを行う場合は、mutexまたは他の同期プリミティブを使用して、複数のスレッドが辞書を同時に変更しないようにする必要があります(辞書の実装が既にこれを行っていない限り)。スレッド固有の変数を使用することもできます( pthread_key_createpthread_setspecificpthread_getspecific 、および pthread_key_delete を参照)現在のスレッドの名前を保存します。ただし、他のスレッドの名前にアクセスすることはできません(辞書を使用すると、任意のスレッドからすべてのスレッドID /名前のペアを反復処理できます)。