gpt4 book ai didi

c++ - 如何在Poco中设置单个线程名称,该名称对于在内核traces/ps/gdb中进行调试是可见的?

转载 作者:行者123 更新时间:2023-12-01 14:50:19 25 4
gpt4 key购买 nike

我最近开始使用线程进行编程,并遇到了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`

以下是我的示例代码(不完美的只是一个惰性代码):

test.cc:
#include "test.h"

void TestThread::run() {
while (1)
;
}

test.h:
#include <Poco/Runnable.h>

class TestThread: public Poco::Runnable
{
public:
void run() override;
};

main.cc:
#include "test.h"
#include <Poco/ThreadPool.h>

using Poco::ThreadPool;

int main()

{
TestThread thread_t;

ThreadPool::defaultPool().start(thread_t, "HappyThread");
while (1)
;

}

就我看过poco文档而言,将字符串传递给start方法可设置线程名称。
我什至尝试使用Poco Thread类并创建了一个线程并调用了setName方法,但观察到了相同的行为

关于Poco为什么会发生这种行为的任何建议,或者没有办法用Poco方法设置名称以反射(reflect)在OS中的任何建议,将有助于理解此问题并找到解决方案。

最佳答案

我只是碰到了这一点,并通过对源代码进行了一些研究来弄清楚了这一点。如果查看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

关于c++ - 如何在Poco中设置单个线程名称,该名称对于在内核traces/ps/gdb中进行调试是可见的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55608628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com