linux 如何在创建时设置pthread名称?

k3bvogb1  于 2022-11-22  发布在  Linux
关注(0)|答案(2)|浏览(230)

我在我的程序中使用了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的第一个控制台输出。

ttisahbt

ttisahbt1#

如何在使用pthread_create()创建线程时设置线程名?
这是不可能的。相反,您可以使用barrier或mutex来同步子线程,直到它准备好运行。或者您可以从线程内部设置线程名称(如果其他线程没有使用它的名称)。
不要使用pthread_setname_np。这是一个非标准的GNU扩展。后缀_np字面上的意思是“不可移植”。编写可移植的代码,而不是使用你自己的地方存储你的线程名。

pcww981p

pcww981p2#

除了pthread_setname_np(3),您还可以将prctl(2)PR_SET_NAME一起使用。此函数的唯一限制是您只能设置调用进程/线程的名称。但由于您的示例正是这样做的,因此此解决方案应该没有问题,而且它是一个可移植的标准API。

相关问题