Forum: PC-Programmierung Vector und Semaphore


von Werner (Gast)


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

von M.K. B. (mkbit)


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.

von Werner (Gast)


Lesenswert?

Vielen Dank für den Fingerzeig! Das sieht schon mal sehr gut aus. Die 
read-prio Variante habe ich verstanden, wie das mit write-prio geht noch 
nicht, aber da muss ich noch nachdenken.

Werner

von Werner (Gast)


Lesenswert?


von Asdf (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.