Frage zu mutex_locks und Vektoroperationen
-
Ich hab da mal eine (hoffentlich einfache) Frage zu diesem Thema:
Nehem wir an ich habe einen Vektor.
Ein einzelner Thread greift auf diesen Vektor zu.
Er prüft ob mind. ein Element existiert, nimmt das erste Element (Index 0) aus dem Vektor und speichert es in einer Variable.
Dann macht er
mein_vector.erase(mein_vector.begin());
Das ganze fortlaufend in einer Schleife.Nun existieren weitere Threads, die nichts aus dem Vektor auslesen und auch nichts löschen sondern lediglich Elemente mit mein_vector.push_back() hinzufügen.
Muss ich nun die pthread_mutex_lock() / unlock Funktionen benutzen oder nicht?
Es läuft bei mir sowohl mit als auch ohne, ich frage mich nur ob es ohne die Locks passieren kann, dass das Programm abstürzt.
Oder ist es egal wenn ich gleichzeitig das unterste Element lösche und oben ein neues draufpacke..?Ich hoffe ich habe mich verständlich genug ausgedrückt
greetz
Marius
-
frage, ist das standard c++?
-
schon wieder falscher Forenbereich?
-
ja,müsste ne Unix funktion sein oder?Hat aufjedenfall google gesagt^^
-
Jein, aber mir gehts dabei ja auch eher darum wie C++ Vektoren behandelt, denn darauf kommts doch an ob ich nen Mutexlock machen muss oder nicht? *grübel*
Dass Threads nicht C++ Standard sind ist mir soweit klar
-
antwort: nein, es dürfte nix passieren
-
Ja, du musst es locken. Keine mir bekannte Implementation der STL macht das von selber, weil dann die Performance im Keller wäre.
-
Dass sie das nicht von selbst macht glaub ich ja.
Die Frage ist nur ob es nötig ist...
Sind die Operationen nicht ziemlich unabhängig voneinander, also erstes löschen und oben eins drauf?
-
Ja, es ist nötig. Wenn du mir nicht glaubst, mach ein Testprogramm, das in mehreren Threads ständig einen vector bearbeitet, und dann schau, ob a) im Vector das richtige drinnen ist, b) ob das Programm abgestürzt ist.
-
Croydon schrieb:
Oder ist es egal wenn ich gleichzeitig das unterste Element lösche und oben ein neues draufpacke..?
Nope. Ist nicht egal. Das funktioniert bereits bei zwei Threads nicht mehr:
Stell dir folgendes Szenario vor (A sei ein Consumer-, B ein Producerthread):
1. Dein Vektor hat eine Kapazität von 4 und enthält bisher 4 Elemente
2. A: holt sich das erste Element
3. A: ruft begin() des Vektors auf und erhält einen Iterator auf den Beginn des Vektors.
4. A wird vor dem Aufruf von erase() unterbrochen. B läuft jetzt.
5. B fügt ein neues Element zum Vektor hinzu. Der Vektor hat jetzt 5 Elemente. Da seine Kapazität nicht mehr ausreicht, muss ein neuer größerer Speicherbereich allokiert werden. Der alte Speicherinhalt wird in den neuen Bereich kopiert und dann gelöscht. Das neue Element wird eingefügt
6. Nun wird B unterbrochen und A läuft weiter.
7. A vollendet den Aufruf von erase(), doch oh weh: Der Iterator den sich A in 3. geholt hat ist mittlerweile nicht mehr gültig -> BUMM!Das ist nur ein mögliches Fehlerszenario. Es gibt unzählige andere.
-
Ok danke, bin überzeugt