2009-04-22 3 views
38

У меня есть многопоточное приложение Linux, написанное на C/C++. У меня chosen names for my threads. Чтобы помочь отладке, я бы хотел, чтобы эти имена были видны в GDB, «top» и т. Д. Это возможно, и если да, то как?Как назвать поток в Linux?

(Есть много reasons to know the thread name. Сейчас я хочу знать, какая нить занимает 50% CPU (как сообщается «сверху»). И при отладке мне часто нужно переключиться на другой поток - в настоящее время у меня есть «thread apply all bt», затем просмотрите страницы выхода backtrace, чтобы найти нужную нить).

Windows solution is here; что такое Linux?

+0

Вопрос: http://stackoverflow.com/questions/5026531/thread-name-longer-than-15-chars – user9876

ответ

41

Posix Threads?

Это, очевидно, не будет компилироваться, но это даст вам представление о том, куда идти на охоту. Я даже не уверен в его правильной команде PR_, но я думаю, что это так. Это было в то время как ...

#include <sys/prctl.h> 
    prctl(PR_SET_NAME,"<null> terminated string",0,0,0) 
+6

Это сработало, спасибо! В документации указано, что PR_SET_NAME задает имя процесса; но эта документация неверна - она ​​фактически устанавливает имя потока. Теперь «top» и «ps -L» показывают имя потока. – user9876

+0

Рад, что это сработало, я не был уверен, что для него это была даже правильная константа. :) – Fusspawn

+0

Я всегда определял темы на основе функции запуска, как показано в трассе стека потока. Приятно знать, что есть чистая альтернатива. – veefu

14

Если вы используете библиотеку как ACEThread имеет возможность указать имя нити при создании нового потока.

BSD Unix имеет также звонок pthread_set_name_np.

В противном случае вы можете использовать prctl, как указано Fusspawn.

+9

В Linux он называется 'pthread_setname_np', и он был добавлен в glibc 2.11.2. – Nemo

+2

[This] (http://stackoverflow.com/questions/2369738/can-i-set-the-name-of-a-thread-in-pthreads-linux) - это, вероятно, наиболее подробный ответ на предмет. –