C++ Ist emplace_back Threadsave?

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
638
Hallo,

kurze Frage: Kann man bei std::vector die Funktion emplace_back() anwenden während ein anderer Thread mit schon bestehenden Einträgen arbeitet?

Beispielsweise die ersten 5 Felder (0-4) werden von einem Thread genutzt und ein weiterer Thread fügt per emplace_back() weitere 5 Felder hinzu mit dem er dann arbeiten will. Jeder Thread hat also strikt getrennt seine eigenen Felder, somit von den Daten her threadsave. Die Frage ist allerdings ist die Funktion emplace_back() threadsave während andere Threads auf schon bestehende Daten zugreifen?

Grüße
 
Du müsstest schon verhindern, dass Thread 1 auf den Vektor zugreift, während Thread 2 diesen erweitern will. Bei emplace_back() wird u.U. Speicher reallokiert und wenn dieser Speicherbereich nicht freigegeben ist bekommst du vmtl. eine Exception
 
  • Gefällt mir
Reaktionen: T_55 und new Account()
T_55 schrieb:
kurze Frage: Kann man bei std::vector die Funktion emplace_back() anwenden während ein anderer Thread mit schon bestehenden Einträgen arbeitet?

Meiner Meinung nach ja wenn sich der vectornicht realloziiert. Vorher groß genug machen: vector::reserve. Probiers doch mal aus.
 
  • Gefällt mir
Reaktionen: T_55
Danke, ok dann mache ich den vector vorher einfach groß genug oder jeder Thread bekommt sein eigenen Vector allerdings muss dann wieder alles zusammengefügt werden.
Nur aus Interesse, gibt es einen std Container der sich threadsave ohne lock vergrößern lässt? Wahrscheinlich ist es aber bei std::map etc ähnlich... ich bleib jetzt erstmal bei der reserve Variante.
 
T_55 schrieb:
Nur aus Interesse, gibt es einen std Container der sich threadsave ohne lock vergrößern lässt?
Glaube nicht, Aber du brauchst doch nur einen decorator drum Machen, Oder du nimmst eine Der unzähligen libraries, die einen threadsave vector bieten.
 
Zurück
Oben