Angenommen, ich habe eine Thread-sichere Sammlung von Things (nennen Sie es eine ThingList), und ich möchte die folgende Funktion hinzufügen.Zurückgeben von Zeigern in einer thread-sicheren Weise
Thing * ThingList::findByName(string name)
{
return &item[name]; // or something similar..
}
Aber auf diese Weise habe ich die Verantwortung für die Thread-Sicherheit an den anrufenden Code delegiert, die so etwas tun hätte:
try
{
list.lock(); // NEEDED FOR THREAD SAFETY
Thing *foo = list.findByName("wibble");
foo->Bar = 123;
list.unlock();
}
catch (...)
{
list.unlock();
throw;
}
Offensichtlich ein RAII Sperren/Entsperren Objekt würde vereinfachen/entfernen Sie das try/catch/entsperrt, aber es ist immer noch einfach für den Anrufer zu vergessen.
Es gibt ein paar Alternativen, die ich angeschaut habe:
- Return Thing von Wert, anstelle eines Zeiger - fein, es sei denn Sie müssen modifizieren, um die Sache
- hinzufügen Funktion
ThingList::setItemBar(string name, int value)
- fein, aber diese neigen dazu, proliferieren - Zurückgeben eines zeigerartigen Objekts, das die Liste bei der Erstellung gesperrt und entsperrt es wieder bei der Zerstörung. Nicht sicher, ob dies eine gute/schlechte Übung ist ...
Was ist der richtige Ansatz dafür?
Die „merge“ ist schön, aber es gibt eine versteckte Annahme, dass Ding Objekte wissen, wie man sich in der Liste finden. Du könntest auch einen "Schlüssel" zum Zusammenführen übergeben, aber dann hast du das Problem, ein gelöschtes Element zusammenzuführen ... – Roddy