Недавно я начал программировать с потоками и наткнулся на Poco и его ресурс потоковой передачи, запуская поток из Poco::ThreadPool::defaultPool().start(*testThread, "HappyThread") и передавая строку «HappyThread» при вызове метода запуска.
После запуска и запуска потока я выполнил команду ps, чтобы получить имя потока, но он говорит «a.out».
vipin@VIPIN:~$ ps H -C a.out -o 'pid tid cmd comm'
PID TID CMD COMMAND
14051 14051 ./a.out a.out
14051 14052 ./a.out a.out
14051 14053 ./a.out a.out`
Принимая во внимание, что когда я использую pthread_setname_np(handle, «HappyThread»), вывод команды ps дает имя потока как «HappyThread», как показано ниже,
vipin@VIPIN:~$ ps H -C a.out -o 'pid tid cmd comm'
PID TID CMD COMMAND
14051 14051 ./a.out a.out
14051 14052 ./a.out HappyThread
14051 14053 ./a.out a.out`
ниже мой пример кода (не идеальный, просто ленивый код):
#include "test.h"
void TestThread::run() {
while (1)
;
}
#include <Poco/Runnable.h>
class TestThread: public Poco::Runnable
{
public:
void run() override;
};
#include "test.h"
#include <Poco/ThreadPool.h>
using Poco::ThreadPool;
int main()
{
TestThread thread_t;
ThreadPool::defaultPool().start(thread_t, "HappyThread");
while (1)
;
}
Насколько я просмотрел документацию poco, передача строки в метод запуска устанавливает имя потока. Я даже пытался использовать класс Poco Thread, создал поток и вызвал метод setName, но наблюдал такое же поведение.
Любые предложения относительно того, почему такое поведение происходит с Poco, или нет возможности задать имя с помощью методов Poco для отражения в ОС, будут полезны для понимания этой проблемы и поиска решения.
Я просто столкнулся с этим и понял это, немного покопавшись в исходном коде. Если вы посмотрите на реализацию платформы для Thread, вы заметите макрос, который включает/выключает имена потоков. в Thread_POSIX.cpp это POCO_POSIX_DEBUGGER_THREAD_NAMES
, а в Thread_WIN32.cpp — POCO_WIN32_DEBUGGER_THREAD_NAMES
.
Итак, вам просто нужно создать библиотеку с этими макросами, определенными для вашей платформы. В OSX я построил с помощью следующих команд, и теперь я вижу имена потоков в XCode:
cmake .. -DCMAKE_CXX_FLAGS = "-DPOCO_POSIX_DEBUGGER_THREAD_NAMES" -DBUILD_SHARED_LIBS=OFF
cmake --build . --config Release