Frage

Nehmen wir an, ich habe einen Behälter (std :: vector) von Zeigern durch ein Multi-Threaded-Anwendung verwendet. Wenn neue Hinweise auf den Behälter hinzugefügt wird, wird der Code mit einem kritischen Abschnitt (boost :: mutex) geschützt. Alles schön und gut. Der Code sollte in der Lage sein, eine dieses Zeigers für die Verarbeitung zu einem Faden zurück, aber ein anderer separater Thread könnte eine dieses Zeiger zu löschen, die noch in Gebrauch sein könnten. z.

thread1()
{
    foo* p = get_pointer();
    ...
    p->do_something();
}

thread2()
{
    foo* p = get_pointer();
    ...
    delete p;
}

So thread2 den Zeiger während thread1 löschen könnte, wird es zu benutzen. Nasty.

Also statt möchte ich einen Container von Boost-Shared PTRs verwenden. IIRC werden diese Zeiger Referenz gezählt werden, so lange, wie ich geteilt PTRs zurückkehren anstelle von rohen Zeiger, eine aus dem Behälter entfernt wird nicht wirklich frei, um es bis zum letzten Einsatz es den Gültigkeitsbereich verlässt. d.

std::vector<boost::shared_ptr<foo> > my_vec;

thread1()
{
    boost::shared_ptr<foo> sp = get_ptr[0];
    ...
    sp->do_something();
}

thread2()
{
    boost::shared_ptr<foo> sp = get_ptr[0];
    ...
    my_vec.erase(my_vec.begin());
}

boost::shared_ptr<foo> get_ptr(int index)
{
    lock_my_vec();
    return my_vec[index];
}

Im obigen Beispiel, wenn thread1 erhält den Zeiger vor thread2 Anrufe zu löschen, wird das Objekt deutete auf noch gültig? Es wird nicht tatsächlich gelöscht werden, wenn thread1 abgeschlossen? Hinweis, dass der Zugang zu dem globalen Vektor über einen kritischen Abschnitt sein wird.

Ich denke, das ist, wie shared_ptrs arbeiten, aber ich muss sicher sein.

War es hilfreich?

Lösung

Für das Einfädeln Sicherheit von boost :: shared_ptr sollten Sie überprüfen, Link . Es ist nicht sicher zu sein, garantiert, aber auf vielen Plattformen funktioniert es. Ändern des std :: vector nicht sicher AFAIK ist.

Andere Tipps

  

Im obigen Beispiel, wenn thread1 erhält den Zeiger vor thread2 Anrufe zu löschen, wird das Objekt deutete auf noch gültig? Es wird nicht tatsächlich gelöscht werden, wenn thread1 abgeschlossen?

In Ihrem Beispiel, wenn thread1 die Zeiger vor thread2 bekommt, dann wird thread2 am Anfang der Funktion warten müssen (wegen der Sperre). Also, ja, wies das Objekt noch gültig sein wird. Allerdings könnten Sie sicherstellen möchten, dass my_vec nicht leer ist, bevor sein erstes Element zugreifen.

Wenn zusätzlich Sie die Zugriffe auf den Vektor synchronisieren (wie in Ihrem ursprünglichen Rohzeiger Vorschlag), um Ihre Nutzung ist sicher. Andernfalls können Sie Foul von Beispiel 4 in der Verbindung durch den anderen Befragten zur Verfügung gestellt fallen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top