我在我的程序中使用了pthread。为了创建,我使用了pthread_create()。在创建之后,我立即使用pthread_setname_np()来设置创建的线程的名称。
我观察到我设置的名称需要一小段时间来反映,最初线程继承程序名称。
在使用pthread_create()创建线程时,有什么建议可以帮助我设置线程名称吗?我在可用的pthread_attr()中研究了一些,但没有找到有帮助的函数。
一个快速的方法来重现我所观察到的,如下:
void * thread_loop_func(void *arg) {
// some code goes here
pthread_getname_np(pthread_self(), thread_name, sizeof(thread_name));
// Output to console the thread_name here
// some more code
}
int main() {
// some code
pthread_t test_thread;
pthread_create(&test_thread, &attr, thread_loop_func, &arg);
pthread_setname_np(test_thread, "THREAD-FOO");
// some more code, rest of pthread_join etc follows.
return 0;
}
输出量:
<program_name>
<program_name>
THREAD-FOO
THREAD-FOO
....
我正在寻找反映THREAD-FOO的第一个控制台输出。
2条答案
按热度按时间ttisahbt1#
如何在使用pthread_create()创建线程时设置线程名?
这是不可能的。相反,您可以使用barrier或mutex来同步子线程,直到它准备好运行。或者您可以从线程内部设置线程名称(如果其他线程没有使用它的名称)。
不要使用
pthread_setname_np
。这是一个非标准的GNU扩展。后缀_np
字面上的意思是“不可移植”。编写可移植的代码,而不是使用你自己的地方存储你的线程名。pcww981p2#
除了
pthread_setname_np(3)
,您还可以将prctl(2)
与PR_SET_NAME
一起使用。此函数的唯一限制是您只能设置调用进程/线程的名称。但由于您的示例正是这样做的,因此此解决方案应该没有问题,而且它是一个可移植的标准API。