当前位置:  开发笔记 > 运维 > 正文

pthread_self()返回的线程ID与调用gettid(2)返回的内核线程ID不同

如何解决《pthread_self()返回的线程ID与调用gettid(2)返回的内核线程ID不同》经验,为你挑选了2个好方法。

该引用来自pthread_self()的手册页.

那么,在什么基础上我应该决定是否应该使用pthread_selfgettid确定哪个线程正在运行该函数?

两者都不便携.
为什么有两个不同的函数来获取线程ID?



1> P.P...:

那么,在什么基础上我应该决定是否应该使用pthread_self或gettid来确定哪个线程正在运行该函数?

pthread_self()只要您想在应用程序中识别线程,就应该始终使用它.gettid() 可以用于某些目的,如果你知道它是Linux.例如,gettid()可用于获取特定于线程的种子(用于srand())的种子.

两者都不便携.

这不完全正确.gettid()不可移植,因为它是一个Linux特定的功能.但pthread_self()只要您不对其表示做任何假设,它就是可移植的.

例如,以下内容不可移植.

printf("Thread ID is: %ld", (long) pthread_self());

因为不能保证任何东西pthread_self()都是某种整数.但

pthread_t my_tid; //filled elsewhere

pthread_t tid = pthread_self();

if( pthread_equal(my_tid, tid) ) {
   /* do stuff */
}

是完全便携的.

前者不可移植,因为它假定线程id是整数而后者不是.

为什么有两个不同的函数来获取线程ID?

它们不是获得相同价值的两种不同方式.一个(pthread_self()由线程库(pthreads)提供而另一个(gettid()是特定于OS的函数.不同的OS可能提供不同的接口/系统调用来获取类似的线程ID gettid().因此您不能依赖于gettid()便携式应用程序.


@TheIndependentAquarius pthread_t是不透明的类型。它可以是“ long long”或“ struct”指针,也可以是实现选择的任何其他类型。您看到的可能是一个ID或一个地址。您就是不能依靠它。`gcc -E -P file.cpp | grep pthread_t可以用来查找您的实现“ typedef”将其实现的内容。但是在其他系统上可能会有所不同。如果需要存储,请使用“ pthread_t”,使用“ pthread_equal()”进行比较。正如Jens指出的那样,您可以将其强制转换为uintptr_t进行打印,以使其对指针类型和整数类型均适用。

2> 小智..:

pthread_self() returns the process-wide unique pthread-id.

gettid()返回(特定于pthread实现)系统范围的唯一thread-id(在Linux上).

the TID(thread id) returned by gettid() is unique inside a process

是.

(or inside a program with multiple processes,

是.

inside a process, different thread has different thread id.

是.

the TID returned by pthread_self() is unique across processes,

没有.

different thread has different TID on the same machine at the same time.

是的,在同一个过程中,整个机器都没有.

由于gettid()是特定于Linux的,因此不可移植,因此系统广泛识别pthread的唯一方法是使用getpid()返回的(系统范围唯一的)父进程id及其(进程范围内唯一的)pthread- id由pthread_self()返回.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有