Поскольку вы говорите, что «мьютекс может быть указателем», вы можете сделать что-то вроде этого:
struct ds { pthread_mutex_t * mutex; /* ... */ };
struct ds * create_ds()
{
struct ds * p = calloc(1, sizeof(struct ds));
pthread_mutex_t * q = malloc(sizeof(pthread_mutex_t));
pthread_mutex_init(q, NULL);
ds->mutex = q;
return p;
}
void free_ds(struct ds * p)
{
pthread_mutex_t * q = p->mutex;
pthread_mutex_lock(q);
free(p);
pthread_mutex_unlock(q);
pthread_mutex_destroy(q);
free(q);
}
На мой взгляд, уничтожение объекта на самом деле не то, что подходит для одновременного доступаидиома синхронизации.Если вы уничтожаете что-то, его больше нет, поэтому все потоки затронуты этим.Как поток должен знать, указывает ли данный указатель ds
на что-то допустимое?
Вместо этого вам, вероятно, нужно иметь где-то коллекцию из ds
объектов и вставить /Доступ для удаления этой коллекции должен иметь свой собственный мьютекс всей коллекции.Каждый раз, когда поток хочет получить ссылку на объект в коллекции, он должен делать это под защитой мьютекса, и коллекция должна знать, кто в данный момент содержит ссылки.