我在QNX IDE中使用C++编写的应用程序中的多个线程中使用了一些函数。有时在分析日志时,很难找到调用它的线程。尽管我可以在日志中使用gettid或pthread_getname_np,但仍然在寻找像 __LINE__这样的标准宏。像'__LINE__'一样,C/C++中是否有标准的宏,可以打印线程名称或ID?
即使它不被QNX支持,我想知道是否有任何其他OS /编译器/标准有它。
我在QNX IDE中使用C++编写的应用程序中的多个线程中使用了一些函数。有时在分析日志时,很难找到调用它的线程。尽管我可以在日志中使用gettid或pthread_getname_np,但仍然在寻找像 __LINE__这样的标准宏。像'__LINE__'一样,C/C++中是否有标准的宏,可以打印线程名称或ID?
即使它不被QNX支持,我想知道是否有任何其他OS /编译器/标准有它。
即使通过预处理器,行的行号在编译时也是已知的,所以预处理器可以用__LINE__
替换实际的行号。
但是,只有在运行时才知道线程ID,而且对于同一语句的不同执行,它也会不同。所以它不可能是一个宏的价值。
您正好需要使用类似于您提到的那种运行时调用来发现线程ID。您可能需要一个特定于平台的机制,因为Posix和C都没有定义一个可移植机制来获取线程ID。从C++ 11开始,您可以使用std::this_thread::get_id()
来获取独特的可打印thread id。
不,因为不像__LINE__
线程ID不是在编译时静态确定的。此外,线程不是C或C++语言的一部分,因此编译器不知道它们 - 在任何情况下(即使C++ 11支持通过标准库的线程),您都必须进行调用以确定线程ID。
如果你真的必须,这总是可以用宏伪造:
#define __THREAD__ gettid()
或C++ 11:
#define __THREAD__ std::this_thread::get_id()
或者是其他系统获得一个线程或进程ID是依赖手段由目标提供 - 它不是完全可移植的,尽管一旦支持无处不在,C++ 11就提供了可移植性的最佳可能性。
但这样做隐藏函数调用的开销,并使其看起来像一个文字常量,我不确定我会主张误导代码。此外,保留使用__
,所以它更具误导性。
如果您对线程的标识句柄感到满意,则第一个参数返回到pthread_create()
的相同值也可以通过运行线程调用pthread_self()
来获得。 这是由计时狐狸
指出,在评论如果仅创建静态组线程,你想每一个序号值相关联,你可以使用一个static
计数器和一个线程局部变量。在创建每个线程时,原子读取和递增计数器,并将线程局部变量设置为读取值。
该id是运行时间特定的,因此不会有类似于编译时已知的\ _ \ _ LINE \ _ \ _的标准宏。 –
引用“* standard *”:'gettid()'不是标准C,'pthread_getname_np()'是POSIX。使用'pthread_self()'。 – alk
您可以使用'pthread_self()'来获得标准的'pthread_t'实例。或者,使用包含“pthread_t”成员和ID(例如结构变量的地址)的包装器结构,并且可以在创建线程时将该地址传递给启动例程。 –