为什么以及在什么意义上pthread_t是一个不透明的类型?

时间:2015-10-22 16:07:41

标签: c multithreading pthreads

这里的帖子提示pthread_t是一个不透明的类型,不是数字,当然不是线程索引,你不应该直接比较pthread_t等等。

问题:

  1. 为什么呢?是否真的有意支持线程没有数字ID的系统?当pthread_t实现只是

    typedef unsigned long int pthread_t;
    

  2. 如何?在上面的行之前有一个评论,所以它实际上是

    /* Thread identifiers. The structure of the attribute type is not
       exposed on purpose.  */
    typedef unsigned long int pthread_t;
    
    pthreadtypes.h中的

    是什么意思?什么属性类型?这不是一个全局线程表的索引吗?

2 个答案:

答案 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可能会保留这样的表)。