Development Tip

Linux pthread에서 스레드 이름을 설정하는 방법은 무엇입니까?

yourdevel 2020. 12. 14. 20:55
반응형

Linux pthread에서 스레드 이름을 설정하는 방법은 무엇입니까?


Linux에서 스레드 이름을 설정하는 방법이 있습니까?

내 주된 목적은 디버깅하는 동안 도움이 될 것이고 예를 통해 그 이름이 노출되면 좋을 것입니다. /proc/$PID/task/$TID/...


prctl(2)옵션과 함께 기능을 사용하십시오 PR_SET_NAME( 문서 참조 ).

문서는 약간 혼란 스럽습니다. 그들은 말한다

호출 프로세스에 대한 프로세스 이름 설정

그러나 스레드는 Linux에서 LWP (경량 프로세스)이므로이 경우 하나의 스레드가 하나의 프로세스입니다.

다음을 사용하여 스레드 이름을 볼 수 있습니다 ps -o cmd.

cat /proc/$PID/task/$TID/comm

또는 사이 ()cat /proc/$PID/task/$TID/stat:

4223 (kjournald) S 1 1 1 0...

또는 info threads큰 따옴표 사이의 GDB 에서 :

* 1    Thread 0x7ffff7fc7700 (LWP 6575) "kjournald" 0x00007ffff78bc30d in nanosleep () at ../sysdeps/unix/syscall-template.S:84                                                                                  

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 (스레드 내에서만 수행 할 수 있음)를 제외하고 다른 것들은 최소한 크로스 플랫폼 코드에 적용하기가 간단합니다.

출처 :


You can implement this yourself by creating a dictionary mapping pthread_t to std::string, and then associate the result of pthread_self() with the name that you want to assign to the current thread. Note that, if you do that, you will need to use a mutex or other synchronization primitive to prevent multiple threads from concurrently modifying the dictionary (unless your dictionary implementation already does this for you). You could also use thread-specific variables (see pthread_key_create, pthread_setspecific, pthread_getspecific, and pthread_key_delete) in order to save the name of the current thread; however, you won't be able to access the names of other threads if you do that (whereas, with a dictionary, you can iterate over all thread id/name pairs from any thread).

참고URL : https://stackoverflow.com/questions/2369738/how-to-set-the-name-of-a-thread-in-linux-pthreads

반응형