GNU/Linux >> Linux の 問題 >  >> Linux

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

辞書マッピング 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                                                                                  

Linux
  1. Linux – Linuxでプロセスのプロセッサ親和性を設定するにはどうすればよいですか?

  2. Linuxで$Path変数を設定する方法

  3. Linux でハードウェア クロックをプログラムで設定するにはどうすればよいですか?

  1. Linuxでスレッドに名前を付ける方法は?

  2. Linuxで永続的な環境変数をプログラムで設定する方法は?

  3. Linux で Windows のタイトルを設定する方法

  1. Linuxがメインフレームに登場した経緯

  2. Linux –オペレーティングシステムの名前を確実に取得するにはどうすればよいですか?

  3. Linux で優先ネットワーク インターフェイスを設定する方法