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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.