【问题标题】:Why and in what sense is pthread_t an opaque type?为什么以及在什么意义上 pthread_t 是不透明类型?
【发布时间】:2023-03-26 21:25:01
【问题描述】:

关于 SO 的帖子表明 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 是什么意思?什么属性类型?这不是某个全局线程表的索引吗?

【问题讨论】:

  • 这不依赖于底层操作系统 API 吗?操作系统内核之外的任何人都不想保留一个全局线程表——它是不可靠的。
  • @MartinJames:如果这就是 pthreads 的原因,请让您的评论成为答案......但是 - 我认为索引要么是操作系统的线程表,要么是库的当操作系统没有公开一个/有一个时的线程表。
  • 在实际的实际实现中仅供参考,它实际上是一个指针,而不是整数/索引。有时,出于遗留兼容性的原因,所述指针被填充到像 unsigned long 这样的整数类型中(假设为 ILP32 或 LP64 模型),但内容实际上是一个地址。

标签: c multithreading pthreads


【解决方案1】:

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 定义示例:

这是一个古老的(2007 年)对 Win32 的 pthreads 库中使用的 pthread_t 结构的证明:https://sourceware.org/ml/pthreads-win32/2007/msg00056.html

【讨论】:

    【解决方案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 可以让实现者避免在其库的代码中使用全局线程表(不过,操作系统可能会保留这样的表)。

    【讨论】:

    • 嗯,实际的类型并没有真正隐藏,但是,好的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2017-05-08
    • 2012-02-27
    • 2012-09-12
    相关资源
    最近更新 更多