这里的帖子提示pthread_t
是一个不透明的类型,不是数字,当然不是线程索引,你不应该直接比较pthread_t等等。
问题:
为什么呢?是否真的有意支持线程没有数字ID的系统?当pthread_t实现只是
时typedef unsigned long int pthread_t;
如何?在上面的行之前有一个评论,所以它实际上是
/* Thread identifiers. The structure of the attribute type is not
exposed on purpose. */
typedef unsigned long int pthread_t;
pthreadtypes.h
中的是什么意思?什么属性类型?这不是一个全局线程表的索引吗?
答案 0 :(得分:4)
POSIX标准允许pthread_t
更复杂(例如结构)。 See this previous question,尤其是@ james-mcnellis的回答。钱报价:
IEEE Std 1003.1-2001 / Cor 2-2004,项目XBD / TC2 / D6 / 26适用,添加 pthread_t到不需要算术的类型列表 类型,因此允许将pthread_t定义为结构。
更新:以下是更复杂pthread_t
定义的几个示例:
这是对Win32的pthreads库中使用的pthread_t
结构的古老(2007)理由:https://sourceware.org/ml/pthreads-win32/2007/msg00056.html
答案 1 :(得分:2)
是否真的有意支持线程没有数字ID的系统?
有不同的类型可以作为数字线程标识符。例如,在资源有限的系统上,可以使用8位线程标识符代替unsigned long
。
属性类型的结构不是故意公开的。
pthread_t
定义的评论不,但pthread_attr_t
定义下面有一行:
typedef union
{
char __size[__SIZEOF_PTHREAD_ATTR_T];
long int __align;
} pthread_attr_t;
评论指出char __size[__SIZEOF_PTHREAD_ATTR_T]
用于隐藏实际struct
的内容。
[
pthread_t
]不是某个全局线程表的索引吗?
不一定是这样。实际类型被隐藏的事实允许实现者使用他希望的任何类型,包括指针或struct
。使用struct
可以让实现者避免在他的库的代码中使用全局线程表(OS可能会保留这样的表)。