Имя нового потока не отображается в выводе pidin

Я пытаюсь изменить имя потока в QNX 6.4.1, но потоки продолжают перечисляться с именем родительского процесса в списке "pidin".

Я создал тему:

iReturn = pthread_create(&threadhandle, &attr, &CALzoneCommThread, this);

Я переименовал поток из самого потока:

iReturn = pthread_setname_np(NULL, "HappyThread");

Я прочитал название темы:

iReturn = pthread_getname_np(NULL, thread_name, 80);

И все потоки возвращают имя «HappyThread», подтвержденное операторами printf, но когда я выполняю pidin, они по-прежнему отображаются с именем процесса «testapp». Мне нужна помощь, чтобы определить, сделал ли я что-то не так в приведенном выше коде или я принципиально неправильно понимаю команду pidin. Из-за требования хорошо работать с устаревшими утилитами потоки должны иметь имя, отличное от имени процесса.

Платформа: QNX 6.4.1 Язык: C


person ThreadBanger    schedule 19.12.2013    source источник
comment
Вы звонили pidin или pidin threads?   -  person gerrit zijlstra    schedule 20.12.2013
comment
Я называю «пидин» без аргументов.   -  person ThreadBanger    schedule 20.12.2013
comment
Тогда попробуйте pidin threads это может вам помочь. Я думаю, что без аргумента имена потоков не будут отображаться.   -  person gerrit zijlstra    schedule 21.12.2013


Ответы (1)


Да, вы сделали что-то не так в коде И вы неправильно понимаете вывод команды pidin:

  1. Поведение вашего кода не указано, потому что вы передаете NULL (который преобразуется в 0) в качестве идентификатора потока. QNX нумерует свои потоки с 1, поэтому поток 0 не указывается. Эксперименты показывают, что передача 0 для TID ведет себя идентично передаче 1 как для pthread_setname_np, так и для pthread_getname_np. Таким образом, ваш код устанавливает и получает идентификатор основного потока, а не потока, который вы создали с помощью вызова pthread_create(). Вы должны передать threadhandle в качестве параметра вызовов set/get_name, чтобы фактически ссылаться на вновь созданный поток:

     iReturn = pthread_setname_np(threadhandle, "HappyThread");
     

  2. Без аргументов pidin вообще не отображает имя потока, установленное с помощью pthread_setname_np(). При вызове без аргументов pidin отображает идентификатор процесса в первом столбце, идентификатор потока (числовой) во втором столбце и имя процесса в третьем столбце (это то, что вы, вероятно, неправильно поняли для имени потока).

  3. вы можете вызвать pidin с аргументом «потоки», как было предложено другими выше; это отобразит имя потока в третьем столбце, если он был настроен, или числовой идентификатор потока в противном случае. В качестве альтернативы вы можете вызвать pidin, как показано ниже, чтобы получить как числовые, так и символические (если доступны) идентификаторы каждого потока:

    пидин -faNbh

Для каждого потока в системе будут напечатаны PID, имя процесса, TID и имя потока в указанном порядке. Обратитесь к разделу «использовать пидин», чтобы узнать, как это работает.

person maverick    schedule 27.12.2013
comment
Спасибо за ответ, Маверик. Я изменил код, как вы предлагаете, и все хорошо. - person ThreadBanger; 02.01.2014
comment
@ThreadBanger: Рад слышать. Возможно, тогда вы могли бы принять ответ? - person maverick; 03.01.2014