2015-09-04 141 views
0

我在QNX IDE中使用C++编写的应用程序中的多个线程中使用了一些函数。有时在分析日志时,很难找到调用它的线程。尽管我可以在日志中使用gettidpthread_getname_np,但仍然在寻找像 __LINE__这样的标准宏。像'__LINE__'一样,C/C++中是否有标准的宏,可以打印线程名称或ID?

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

+7

该id是运行时间特定的,因此不会有类似于编译时已知的\ _ \ _ LINE \ _ \ _的标准宏。 –

+2

引用“* standard *”:'gettid()'不是标准C,'pthread_getname_np()'是POSIX。使用'pthread_self()'。 – alk

+1

您可以使用'pthread_self()'来获得标准的'pthread_t'实例。或者,使用包含“pthread_t”成员和ID(例如结构变量的地址)的包装器结构,并且可以在创建线程时将该地址传递给启动例程。 –

回答

7

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

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

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

+2

值得注意的是,在特定的进程中,即使在运行时,也没有**可移植的方式来获取特定线程的唯一集成线程ID。一些操作系统提供了一种方式,但这些方法都不符合POSIX标准。 – tonysdg

+1

@tonysdg:C++确实有一种获得独特可打印线程标识符(std :: thread :: id)的可移植方式。我不知道C或Posix的等价物,但这个问题是(也)标记为C++。 – rici

2

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

如果你真的必须,这总是可以用宏伪造:

#define __THREAD__ gettid() 

或C++ 11:

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

或者是其他系统获得一个线程或进程ID是依赖手段由目标提供 - 它不是完全可移植的,尽管一旦支持无处不在,C++ 11就提供了可移植性的最佳可能性。

但这样做隐藏函数调用的开销,并使其看起来像一个文字常量,我不确定我会主张误导代码。此外,保留使用__,所以它更具误导性。

1

如果您对线程的标识句柄感到满意,则第一个参数返回到pthread_create()的相同值也可以通过运行线程调用pthread_self()来获得。 这是由计时狐狸

指出,在评论如果仅创建静态组线程,你想每一个序号值相关联,你可以使用一个static计数器和一个线程局部变量。在创建每个线程时,原子读取和递增计数器,并将线程局部变量设置为读取值。

相关问题