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_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 세트 이름 / getname
- IBM setname / getname
- Mac OS X
/Developer/SDKs/MacOSX10.7.sdk/usr/include/pthread.h
- QNX setname / getname
- FreeBSD setname / no getname as far as i can see
- OpenBSD setname / no getname as far as i can see
- NetBSD setname / getname
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
'Development Tip' 카테고리의 다른 글
C ++, Windows 프로세스가 실행 중인지 확인하는 방법은 무엇입니까? (0) | 2020.12.14 |
---|---|
프로그래밍 방식으로 무음 모드의 Android 전화 여부를 어떻게 감지합니까? (0) | 2020.12.14 |
남은 다운로드 시간을 정확히 추정하는 방법은 무엇입니까? (0) | 2020.12.14 |
Spinner 기본값을 null로 설정하는 방법은 무엇입니까? (0) | 2020.12.14 |
/// summary 생성 방법 (0) | 2020.12.14 |