Vector und Semaphore

Gast #5333705
Lesenswert?

Hallo,

ich habe einen Vektor aus Objekten:
1
class Data {
2
};
3

4
vector<Data> vect;

Nun habe ich einige Workerthreads, die sich jeweils immer ein Objekt aus 
der Liste "leihen" (einen Zeiger auf in Objekt im Vektor), einige 
Sekunden damit arbeiten und wieder einige Zeit warten. Die Worker sollen 
das gleichzeitig dürfen. Nun gibt es noch einen Thread der die Struktur 
ändern kann (hinzufügen oder Entfernen von Datenobjekten). Der 
"Strukturthread" soll, wenn Umbauarbeiten anstehen, warten bis alle 
Worker gerade kein Datenobjekt mehr brauchen. Während der Strukturthread 
umbaut, darf kein Workerthread ein Datenobjekt bekommen. Damit der 
Strukturthread nicht unendlich warten muss, dürfen die Worker auch schon 
nichts aus der Liste holen wenn Umbauarbeiten anstehen.

1. Workerthreads leihen Objekte, auch gleichzeitig
2. Umbaumaßnahmen stehen an;
 a) Workerthreads müssen warten bis Objekte geholt werden können
 b) Strukturthread wartet bis alle Worker fertig sind
3. Vektor umbauen
4. Workerthreads dürfen wieder Objekte holen.

Mir stehen Semaphore und Mutexe zur Verfügung (Linux Posix C++), aber 
wie könnte ich das damit umsetzen?

Werner
#5333772
Lesenswert?

Ich würde es mit einem Read/Write Lock lösen.

Die Workerthreads halten alle jeweils ein Read Lock.
Die Umbaumaßnahme hält ein Write Lock.

Hier ist eine Beschreibung inklusive Beispielimplementierung und 
bestehenden Implementierungen (z.B. POSIX).
https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock

In deinem Fall wäre wahrscheinlich ein Write-preferring RW lock 
sinnvoll, damit die Änderungen sobald wie möglich umgesetzt werden, ohne 
dass neue Workerthreads arbeiten.
Gast #5336754
Lesenswert?

dir ist aber hoffentlich klar, dass beim Hinzufügen von Elementen 
innerhalb eines Vektors alle Daten komplett umkopiert werden können, so 
dass, falls Du per Zeiger oder Ref auf sie El,ente des Vektors 
zugreifst, Deine werte ungültig werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren