Tengo que diseñar una estructura de datos que se utilizará en un entorno de subprocesos múltiples. La API básica es simple: insertar elemento, eliminar elemento, recuperar elemento, verificar que ese elemento exista. La implementación de la estructura usa un bloqueo implícito para garantizar la atomicidad de una única llamada API. Después de implementar esto, se hizo evidente, que lo que realmente necesito es la atomicidad en varias llamadas API. Por ejemplo, si una persona que llama tiene que comprobar la existencia de un elemento antes de tratar de insertarlo él no puede hacer eso de forma atómica, incluso si cada llamada a la API sola es atómica:Diseño de estructura de datos Thread-Safe
if(!data_structure.exists(element)) {
data_structure.insert(element);
}
El ejemplo es algo torpe, pero el punto básico es que no podemos confiar más en el resultado de la llamada a "existir" después de regresar del contexto atómico (el conjunto generado muestra claramente una pequeña posibilidad de cambio de contexto entre las dos llamadas).
Lo que actualmente tengo en mente para resolver esto es exponer el bloqueo a través de la API pública de la estructura de datos. De esta forma, los clientes tendrán que bloquear explícitamente las cosas, pero al menos no tendrán que crear sus propios bloqueos. ¿Existe una solución mejor conocida para este tipo de problemas? Y mientras lo hagamos, ¿puede aconsejarnos buena literatura sobre diseño seguro para subprocesos?
EDIT: Tengo un mejor ejemplo. Supongamos que la recuperación de elementos devuelve una referencia o un puntero al elemento almacenado y no su copia. ¿Cómo se puede proteger a una persona que llama para usar de forma segura este puntero \ referencia después de que la llamada vuelve? Si cree que no devolver copias es un problema, entonces piense en copias en profundidad, es decir, objetos que también deberían copiar otros objetos a los que apuntan internamente.
Gracias.
Sobre usted edite: Piense en la situación, donde el puntero al elemento almacenado devuelto, y otro hilo intenta eliminar este elemento de data_structture. Al menos debe elegir qué comportamiento se debe implementar en relación con el modelo de bloqueo. ¿Devolver error al hilo tratando de quitar el objeto? espere a que el objeto se vuelva sin referencias, etc. – drlazy