【问题标题】:Like '__LINE__', is there any standard macro in C/C++ which prints thread name or ID?像“__LINE__”一样,C/C++ 中是否有任何标准宏可以打印线程名称或 ID?
【发布时间】:2015-09-04 15:32:28
【问题描述】:

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

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

【问题讨论】:

  • 该 id 是特定于运行时的,因此不会有类似于 __LINE__ 的标准宏,它在编译时是已知的。
  • 引用“standard”:gettid() 不是标准 C,pthread_getname_np() 也不是 POSIX。使用pthread_self()
  • 您可以使用pthread_self() 获取pthread_t 实例,这是标准的。或者,使用包含 pthread_t 成员和 ID(例如结构变量的地址)的包装结构,您可以在创建线程时将该地址传递给启动例程。
  • 我认为我犯了一个愚蠢的错误,忽略了一个简单的事实,即在预处理状态下线程 ID 是未知的。谢谢大家指出!

标签: c++ c macros posix qnx


【解决方案1】:

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

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

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

【讨论】:

  • 值得注意的是,没有没有可移植的方式来获取特定进程中特定线程的唯一完整线程ID,即使在运行时也是如此。一些操作系统提供了一种方法,但这些方法都不符合 POSIX。
  • @tonysdg:C++ 确实有一种可移植的方式来获取唯一的可打印线程标识符(std::thread::id)。我不知道 C 或 Posix 等价物,但这个问题(也)被标记为 C++。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    不,因为与__LINE__ 不同,线程 ID 不是在编译时静态确定的。此外,线程不是 C 或 C++ 语言的一部分,因此编译器不知道它们 - 在任何情况下您都必须调用以确定线程 ID(尽管 C++ 11 通过标准库支持线程)。

    如果你真的需要,这总是可以用宏来伪造的:

    #define __THREAD__ gettid()
    

    或在 C++ 11 中:

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

    或者目标提供的任何与系统相关的获取线程或进程 ID 的方法 - 它不是完全可移植的,尽管一旦支持无处不在,C++11 提供了可移植性的最佳可能性。

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

    【讨论】:

      【解决方案4】:

      如果您对线程的标识句柄感到满意,那么在第一个参数中返回给pthread_create() 的值也可以由正在运行的线程通过调用pthread_self() 来获得。这已被指出在 Chrono Kitsune 的评论中发表

      如果您只创建一组静态线程并且希望将每个线程与一个序数值相关联,则可以使用static 计数器和线程局部变量。在创建每个线程时,原子地读取并递增计数器,并将线程局部变量设置为读取的值。

      【讨论】:

        猜你喜欢
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多