Además de las comprobaciones de valor de retorno que faltan, hay algunos problemas más que deberían solucionarse:
sem_destroy
no se llama.- Señal/transmisión toque el
cond_node_t
después de activar el subproceso de destino, lo que podría resultar en un uso después de la liberación.
Más comentarios:
- La operación de destrucción omitida puede requerir cambios en las otras operaciones, por lo que es seguro destruir la variable de condición cuando POSIX dice que será seguro. No apoyar la destrucción o imponer restricciones más estrictas sobre cuándo se puede llamar simplificará las cosas.
- Una implementación de producción manejaría la cancelación de subprocesos.
- Salir de una espera (como se requiere para la cancelación de subprocesos y
pthread_cond_timedwait
tiempos de espera) pueden dar lugar a complicaciones. - Su implementación pone en cola los subprocesos en el espacio del usuario, lo que se hace en algunas implementaciones de producción por motivos de rendimiento; No entiendo exactamente por qué.
- Su implementación siempre pone en cola los subprocesos en orden LIFO. Esto suele ser más rápido (por ejemplo, debido a los efectos de caché), pero puede llevar a la inanición. La implementación de producción puede usar el orden FIFO a veces para evitar el hambre.
Básicamente, su estrategia se ve bien, pero tiene un gran peligro, un comportamiento indefinido y una pequeña elección:
- no está inspeccionando los valores de retorno de sus funciones POSIX. En particular
sem_wait
es interrumpible, por lo que bajo una carga pesada o mala suerte, su hilo se despertará falsamente. Tendrías que atrapar cuidadosamente todo eso - ninguna de sus funciones devuelve un valor. Si algún usuario de las funciones decide usar los valores devueltos algún día, este es un comportamiento indefinido. Analice cuidadosamente los códigos de error que las funciones de condición pueden devolver y haga precisamente eso.
- no lanzar el retorno de
malloc
ocalloc
Editar: En realidad, no necesitas malloc
/free
en absoluto. Una variable local también funcionaría.