像"__LINE__"一样,C/C++ 中是否有任何打印线程名称或 ID 的标准宏?

Like '__LINE__', is there any standard macro in C/C++ which prints thread name or ID?

本文关键字:线程 ID 标准 打印 一样 LINE C++ 是否 任何      更新时间:2023-10-16

我在QNX IDE中使用c++编写的应用程序中使用多线程的一些函数。有时,在分析日志时,很难找到调用它的线程。虽然我可以在日志中使用gettid或pthread_getname_np,但仍在寻找像__LINE__这样的标准宏。

即使它不支持QNX,我想知道是否有任何其他操作系统/编译器/标准有它。

一行的行号在编译时是已知的,即使是预处理器也知道,因此预处理器可以用实际的行号替换__LINE__

但是thread-id只有在运行时才知道,而且对于同一条语句的不同执行,它将是不同的。所以它不可能是宏的值。

您确实需要使用您提到的运行时调用来发现线程id。您可能需要特定于平台的机制,因为Posix和C都没有定义可移植的机制来获取线程id。从c++ 11开始,您可以使用std::this_thread::get_id()来获得唯一的、可打印的线程id。

在c++ 11中,检查std::this_thread::get_id。如果需要的话,它有一个生成人类可读字符串的方法。该行为没有标准宏,因为它相当依赖于运行时。

不,因为不像__LINE__线程id在编译时不是静态确定的。此外,线程不是C或c++语言的一部分,所以编译器不会意识到它们——在任何情况下,你都必须通过调用来确定线程ID(尽管c++ 11通过标准库支持线程)。

如果你真的必须这样做,你可以使用宏:

#define __THREAD__ gettid()

或c++ 11中的

#define __THREAD__ std::this_thread::get_id()

或者任何由目标提供的获取线程或进程ID的依赖于系统的方法——它不是完全可移植的,尽管c++ 11在支持无处不在的情况下为可移植性提供了最好的可能性。

但是这样做隐藏了函数调用的开销,使它看起来像一个字面常量,我不确定我是否会提倡误导代码。此外,__的使用是保留的,因此进一步误导。

如果您对线程的标识句柄感到满意,那么运行的线程也可以通过调用pthread_self()来获得第一个参数返回给pthread_create()的相同值。这在Chrono Kitsune

的评论中指出。

如果你只是创建一个静态的线程集,并且你想把每个线程与一个序数相关联,你可以使用一个static计数器和一个线程局部变量。在创建每个线程时,自动读取和增加计数器,并将线程局部变量设置为读取值。