Я читал файлы заголовков библиотеки pthreads и нашел это конкретное определение мьютекса (и других типов) в битах /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;
Это не совсем так, но я упростил это для ясности. Создание структуры с двумя разными определениями в заголовке и в файле реализации, являющейся реализацией определения реальной структуры и заголовка только символьного буфера размера реальной структуры, используется в качестве метода для скрытия реализации (непрозрачный тип), но по-прежнему выделяет правильный объем памяти при вызове malloc или распределении объекта в стеке.
Эта конкретная реализация использует объединение и все еще подвергает как определение структуры, так и символьного буфера, но, похоже, не дает никаких преимуществ с точки зрения скрытия типа, поскольку структура все еще отображается, а двоичная совместимость все еще зависящая от неизменности структур.
- Почему типы, определенные в pthreads, следуют этому шаблону?
- Каковы преимущества наличия непрозрачных типов, если вы не предоставляете двоичную совместимость (как в непрозрачном шаблоне указателя)? Я понимаю, что безопасность - это один из них, поскольку вы не позволяете пользователю вмешиваться в поля структуры, но есть ли что-нибудь еще?
- Существуют ли типы pthread, предназначенные, в основном, для статических инициализаций или существует ли какая-либо другая конкретная причина для этого?
- Возможно ли реализовать реализацию pthreads после непрозрачного шаблона указателя (т.е. не подвергать любые типы вообще и не допускать статических инициализаций)? или, более конкретно, есть ли ситуация, когда проблема может быть решена только с помощью статических инициализаций?
- И полностью не связаны между собой, есть ли "до основных" потоков в C?