Acceso concurrente y libre de objetos de stack.

Esta pregunta es un posible problema secundario a este acceso concurrente y está libre de una estructura de datos

La otra pregunta está abierta al diseño, esta es más concreta.

struct ds { int x,y,z; pthread_mutex_t mutex; }; 

Necesito una solución determinista a través de la cual puedo acceder simultáneamente a 1 objeto de tipo ds y liberarlo.

Restricciones:

  1. Puede hacer que mutex sea un puntero, pero no puede sacarlo del objeto.

El problema real:

Libre no se puede hacer manteniendo el locking porque, entonces, la memoria ocupada por el locking también se pierde.

He leído muchos artículos y artículos sobre el recuento de referencias, pero cada uno de ellos mantiene un candado fuera de la ds. Quiero una solución donde pueda mantener un locking o una referencia al locking dentro de ds.

Ya que dices que “el mutex puede ser un puntero”, podrías hacer algo como esto:

 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); } 

Sin embargo, en mi opinión, destruir un objeto no es realmente algo que se ajuste al lenguaje de sincronización / acceso concurrente. Si destruyes algo, ya no está allí, por lo que todos los subprocesos se ven afectados por esto. ¿Cómo se supone que un hilo sabe si un puntero ds dado todavía apunta a algo válido?

En su lugar, probablemente debería tener una colección de objetos ds algún lugar, y el acceso de inserción / borrado a esa colección debería tener su propia exclusión mutua, separada, de toda la colección. Cada vez que un subproceso desea obtener una referencia a un objeto de la colección, debe hacerlo bajo la protección de un mutex, y la colección debe saber quién tiene actualmente las referencias.