我在QNX IDE中使用C ++编写的应用程序中的多个线程中使用了一些函数。有时在分析日志时,很难找到调用它的线程。虽然我可以在日志中使用gettid或pthread_getname_np,但仍在寻找像 __LINE__ 这样的标准宏。
即使QNX不支持,我也想知道是否有其他操作系统/编译器/标准。
答案 0 :(得分:7)
行的行号在编译时是已知的,即使是预处理器也是如此,因此预处理器可以用__LINE__
替换实际的行号。
但是thread-id只在运行时才知道,而且对于同一语句的不同执行它也会有所不同。所以它不可能是宏的价值。
您需要使用类似于您提及的运行时调用才能发现线程ID。您可能需要特定于平台的机制,因为Posix和C都没有定义获取线程ID的可移植机制。从C ++ 11开始,您可以使用std::this_thread::get_id()
获取唯一的可打印thread id。
答案 1 :(得分:4)
在C ++ 11中,查看std::this_thread::get_id。 如果需要,它有一种生成人类可读字符串的方法。此行为没有标准宏,因为它依赖于运行时。
答案 2 :(得分:2)
不,因为与__LINE__
不同,线程ID在编译时不是静态确定的。此外,线程不是C或C ++语言的一部分,因此编译器不知道它们 - 您必须在任何情况下调用以确定线程ID(尽管C ++ 11支持通过标准库的线程)。 / p>
如果你真的必须,这总是可以伪造一个宏:
#define __THREAD__ gettid()
或在C ++ 11中:
#define __THREAD__ std::this_thread::get_id()
或者目标提供了获取线程或进程ID的任何依赖于系统的方法 - 它不是完全可移植的,尽管一旦支持无处不在,C ++ 11就提供了可移植性的最佳可能性。
但这样做会隐藏函数调用的开销并使其看起来像一个文字常量,我不确定我是否提倡误导代码。此外,__
的使用是保留的,因此更具误导性。
答案 3 :(得分:1)
如果您对某个线程的标识句柄感到满意,那么运行的线程也可以通过调用pthread_self()
来获取第一个参数pthread_create()
中返回的相同值。 Chrono Kitsune的评论
如果您只是创建一组静态线程,并且想要将每个线程与序数值相关联,则可以使用static
计数器和线程局部变量。在创建每个线程时,以原子方式读取并递增计数器,并将线程局部变量设置为读取值。