像"__LINE__"一样,C/C++ 中是否有任何打印线程名称或 ID 的标准宏?
Like '__LINE__', is there any standard macro in C/C++ which prints thread name or ID?
我在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
计数器和一个线程局部变量。在创建每个线程时,自动读取和增加计数器,并将线程局部变量设置为读取值。
- 我应该在C++中打印线程 ID 吗?
- 我可以使用Qt线程ID为每个线程创建唯一的缓存吗?
- 这种基于线程 ID 的同步是否安全整洁?
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- C 不同的线程在FreeBSD 10上具有相同的线程ID
- 如何获取正确的线程 ID 和值
- 调试器看到的输出线程 ID
- 是否可以向特定的线程 ID 发送信号?
- C++ 中 OpenMP 中的有序线程 ID
- 您可以在 OpenMP 中将特定线程 ID 分组到唯一的任务组中吗?
- 查找称为函数C 的线程ID
- 确定进程的输入线程 ID
- SetWindowShookex(WH_KEYBOARD)无法与线程ID一起使用
- 在性能方面获取线程 ID 是否昂贵
- 标准::线程::id的要求.可以雾化吗?
- 如何知道谁是给定线程 ID 的父线程
- 当OwningThread表示线程ID时,它为什么是HANDLE类型的CRITICAL_SECTION的成员
- 不确定我在提升日志中的线程 ID 是否正确
- 线程ID不存在的OpenThread
- 如果父线程 ID 没有作为pthread_create上的参数传入,是否可以从 C/C++ 中的线程中获取父线程 ID?