Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
像“\uuuu LINE\uuuuuu”一样,C/C++中是否有打印线程名称或ID的标准宏?_C++_C_Macros_Posix_Qnx - Fatal编程技术网

像“\uuuu LINE\uuuuuu”一样,C/C++中是否有打印线程名称或ID的标准宏?

像“\uuuu LINE\uuuuuu”一样,C/C++中是否有打印线程名称或ID的标准宏?,c++,c,macros,posix,qnx,C++,C,Macros,Posix,Qnx,我在QNXIDE中用C++编写的应用程序中的多个线程使用一些函数。有时在分析日志时,很难找到调用它的线程。虽然我可以在日志中使用或,但仍在寻找类似的标准宏 即使QNX不支持它,我也想知道是否有其他操作系统/编译器/标准支持它。一行的行号在编译时是已知的,即使是预处理器也知道,因此预处理器可以用实际的行号代替uuu line 但是线程id只有在运行时才知道,而且对于同一语句的不同执行,它也会有所不同。因此,它不可能是宏的值 为了发现线程id,您确实需要使用您提到的运行时调用。您可能需要特定于平台的

我在QNXIDE中用C++编写的应用程序中的多个线程使用一些函数。有时在分析日志时,很难找到调用它的线程。虽然我可以在日志中使用或,但仍在寻找类似的标准宏


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

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

但是线程id只有在运行时才知道,而且对于同一语句的不同执行,它也会有所不同。因此,它不可能是宏的值

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

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

没有,因为与_u行不同,线程ID在编译时不是静态确定的。此外,线程不是C++或C++语言的一部分,因此编译器不知道它们——在任何情况下,都必须调用一个线程来确定线程ID,尽管C++ 11通过标准库支持线程。 如果确实必须这样做,则始终可以使用宏来伪造:

#define __THREAD__ gettid()

或C++ 11:

#define __THREAD__ std::this_thread::get_id()
或者,无论目标提供何种依赖于系统的获取线程或进程ID的方法,它都不是完全可移植的,尽管C++11在支持无处不在的情况下提供了可移植性的最佳可能性


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

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


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

该id是特定于运行时的,因此不会有类似于编译时已知的uu LINE_u_u_uu的标准宏。引用标准:getId不是标准C,pthread_getname_np也不是POSIX。使用pthread_self。您可以使用pthread_self获取pthread_t实例,这是标准的。或者,使用包含pthread_t成员和ID(例如结构变量的地址)的包装器结构,您可以在创建线程时将该地址传递给启动例程。我认为我犯了一个愚蠢的错误,忽略了一个简单的事实,即线程ID在预处理状态下是未知的。谢谢大家指出这一点!值得注意的是,即使在运行时,也没有可移植的方法来获取特定进程中特定线程的唯一完整线程ID。有些OSES提供了一种方法,但没有一种方法是POSIX兼容的。@ TyySDSD:C++确实有一种可移植的方式来获得唯一可打印线程标识STD::To::Id。我不知道C或POSIX等价物,但这个问题也被标记为C++。