<分区>
我正在阅读 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;
它并不完全像这样,但为了清楚起见,我对其进行了简化。在 header 和实现文件中创建一个具有两个不同定义的结构,作为真正结构定义的实现,而 header 只是实际结构大小的字符缓冲区,用作隐藏实现的技术(不透明类型) 但在调用 malloc 或在堆栈中分配对象时仍会分配正确数量的内存。
这个特定的实现使用了一个 union 并且仍然公开了结构的定义和字符缓冲区,但似乎没有提供任何隐藏类型的好处,因为结构仍然公开并且二进制兼容性是仍然依赖于结构不变。
- 为什么 pthreads 中定义的类型遵循这种模式?
- 如果您不提供二进制兼容性(如不透明指针模式),那么使用不透明类型有什么好处?我知道安全是其中之一,因为您不允许用户篡改结构的字段,但还有其他问题吗?
- 公开的 pthread 类型主要是为了允许静态初始化还是有任何其他特定原因?
- 遵循不透明指针模式(即根本不公开任何类型并且不允许静态初始化)的 pthreads 实现是否可行?或者更具体地说,是否存在只能通过静态初始化解决问题的情况?
- 完全不相关,C 中是否有“主线程之前”?