Supongamos que tengo una colección flujos seguros de las cosas (lo llaman un ThingList), y quiero añadir la siguiente función.punteros que regresan de una manera segura para los subprocesos
Thing * ThingList::findByName(string name)
{
return &item[name]; // or something similar..
}
Pero al hacer esto, he delegado la responsabilidad de la seguridad de rosca al código de llamada, lo que tendría que hacer algo como esto:
try
{
list.lock(); // NEEDED FOR THREAD SAFETY
Thing *foo = list.findByName("wibble");
foo->Bar = 123;
list.unlock();
}
catch (...)
{
list.unlock();
throw;
}
Obviamente una cerradura RAII/desbloquear objeto sería simplifique/elimine try/catch/unlocks, pero aún así es fácil que la persona que llama lo olvide.
Hay algunas alternativas que he mirado:
- Retorno cosa por valor, en lugar de un puntero - bien a menos que necesite modificar el cosa
- Añadir función
ThingList::setItemBar(string name, int value)
- bien, pero éstos tienden a proliferar - devolver un objeto pointerlike que bloquea la lista de la creación y la abre de nuevo en la destrucción. No estoy seguro si esto es una buena/mala práctica ...
¿Cuál es el enfoque correcto para hacer frente a esto?
El "Combinar" es agradable, pero hay un supuesto oculto que los objetos Cosa saben cómo ubicarse en la lista. También puede pasar "clave" para fusionarse, pero luego tiene el problema de fusionar un elemento que se ha eliminado ... – Roddy