小编Ani*_*lM3的帖子

Pthreads和不透明类型

我正在读取pthreads库的头文件,并在bits/pthreadtypes.h中找到了互斥体(和其他类型)的这个特定定义:

typedef union
{
  struct __pthread_mutex_s
  {
    int __lock;
    unsigned int __count;
    int __owner;
    /* KIND must stay at this position in the structure to maintain
       binary compatibility.  */
    int __kind;
    unsigned int __nusers;
    __extension__ union
    {
      int __spins;
      __pthread_slist_t __list;
    };
  } __data;
  char __size[__SIZEOF_PTHREAD_MUTEX_T];
  long int __align;
} pthread_mutex_t;
Run Code Online (Sandbox Code Playgroud)

它不完全是这样,但为了清晰起见我简化了它.在头文件和实现文件中创建一个具有两个不同定义的结构,实现真正的结构定义,标题只是真实结构大小的字符缓冲区,用作隐藏实现的技术(opaque类型) )但在调用malloc或在堆栈中分配对象时仍然分配正确的内存量.

这个特殊的实现使用了一个union并且仍然暴露了struct的结构和字符缓冲区,但是在隐藏类型方面似乎没有提供任何好处,因为结构仍然暴露,并且二进制兼容性依赖于结构没有变化.

  1. 为什么pthreads中定义的类型遵循此模式?
  2. 如果您不提供二进制兼容性(如在不透明指针模式中),拥有opaque类型有什么好处?我理解安全性是其中之一,因为您不允许用户篡改结构的字段,但还有其他什么吗?
  3. pthread类型是否主要暴露于允许静态初始化,还是有任何其他特定原因?
  4. 在不透明指针模式之后实现pthreads实现是否可行(即根本不暴露任何类型并且不允许静态初始化)?或者更具体地说,是否存在只能通过静态初始化来解决问题的情况?
  5. 并且完全不相关,C中有"主要"线程吗?

c struct pthreads unions

11
推荐指数
1
解决办法
1053
查看次数

标签 统计

c ×1

pthreads ×1

struct ×1

unions ×1