Threadsicherheit von map
-
Hi
Ich muss für ein Projekt heute das erste mal mit Threads arbeiten.
Ich habe eine std::map die zunächst gefüllt wird.
Im weiteren Verlauf greifen zwei Threads parallel auf diese map zu. Beide aber ausschließlich lesend.
Muss ich mir hier um die Threadsicherheit gedanken machen oder kann ich dieses Thema für einen rein lesenden Zugriff ignorieren?mfg
stein
-
Wenn alle teilnehmenden Kandidaten nur lesen, ist das kein Problem

-
Badestrand schrieb:
Wenn alle teilnehmenden Kandidaten nur lesen, ist das kein Problem

Wie sieht das eigentlich bei den anderen Container-Klassen wie Listen, Vektoren, Queues etc. aus?
Kann man da auch eine allgemeingültige Aussage machen?
-
Badestrand schrieb:
Wenn alle teilnehmenden Kandidaten nur lesen, ist das kein Problem


greetz, Swordfish
-
"Wenn alle teilnehmenden Kandidaten nur lesen"
was man aber in der Regel spätestens beim Beenden vergessen kann...

-
In meinem Beispiel sollte das kein Problem darstellen.
Mein Hauptthread startet zunächst einen Thread der mir die map befüllt.
Nachdem das abgeschlossen ist wird der eine beendet und der neue gestartet. Dieser greift wie mein Hauptthread lediglich lesend auf die map zu.Ich hätte allerdings noch zwei kleine Fragen:
Kennt vielleicht jemand eine Seite auf der ich mir etwas zu Threads auf Windowsmaschinen anlesen kann, vor allem das thema Threadsicherheit interessiert mich.Außerdem würde mich interessieren ob die Funktion GetTickCount() threadsicher ist.
-
Außerdem würde mich interessieren ob die Funktion GetTickCount() threadsicher ist.
Hab ich zwar jz auf die Schnelle nix gefunden, aber ich bin mir eigtl zu 100% sicher, dass sie das ist... Warum sollte sie nicht? Wenn sie das nicht ist, dann könnte man sie nie verwenden, weil sie wohl kaum jede Millisekunde ne Variable erhöht - sondern einfach den aktuellen Timestamp - StartTimeStamp zurückgeben wird... Also wieder nur lesend, wo wir scho wieder bei Post #2 angelangt wären: Es ist alles threadsicher, was immer nur gelesen und nicht geschrieben wird...
Außerdem ist der Befehl ja Systemweit nutzbar... Also wird sich das System auch drum kümmern, dass 2 Programme unabhängig voneinander darauf zugreifen können (stell dir ma vor, du müsstest bei jeder WinAPI-Fkt immer erst gucken, ob irgend ein anderes Programm sie gerad aufruft und wie leicht könnte man dann irgendwelche programme schreiben, die Fkt der WinAPI blockieren schreiben? Oo)...
Wenn du mir nicht glaubst, erstell doch ma nen Programm:#include <windows.h> int main () { for (;;) { GetTickCount (); } }Das musst du nur nen paar mal starten und so bald es nur dein System zu 100% auslastet (was es 100%ig machen wird ^^) und nicht abstürzt oder iwelche fehlermeldungen bringt ist es threadsicher - wär auch komisch, wenn nicht - aber das hab ich ja scho ma geschrieben
Mein Hauptthread startet zunächst einen Thread der mir die map befüllt.
Nachdem das abgeschlossen ist wird der eine beendet und der neue gestartet. Dieser greift wie mein Hauptthread lediglich lesend auf die map zu.Wo steckt der Sinn, wenn du ne map in nem thread befüllst und eh auf den warten musst? Oo also blockierst du dein main-thread ja doch wieder...
und der neue gestartet
also es existieren immer nur genau 2 threads? und die lesen beide nur?
was ist aber, wenn du jz dein programm beendest?
der mainthread bekommt das signal, will die map zerstören und der thread liest aber gerade... brauchst du also zumindest nen event zum beenden oder ne criticalsection...Kennt vielleicht jemand eine Seite auf der ich mir etwas zu Threads auf Windowsmaschinen anlesen kann, vor allem das thema Threadsicherheit interessiert mich.
msdn würd ich dir empfehlen - da steht alles iwo, was man wissen muss ^^ musst du dich zwar immer ein wenig hin und herklicken, aber eigtl muss man nur das wissen:
schreibende zugriffe: immer nur genau einer!
lesende zugriffe: unendlich viele - so lange eben keiner schreibt ^^Bye
-
Hätte mich auch sehr gewundert wenn GetTickCount nicht threadsicher wäre. Wollte einfach mal nachfragen.
Hab mich da wohl falsch ausgedrückt. Der Mainthread ist die Oberfläche, der erste Parallelthread liest Wegpunkte aus einer Datenbank in die map, der Fortschritt wird dem User auf der Oberfläche angezeigt.
Nachdem der Ladevorgang beendet ist beendet sich der Thread selbst. Der User hat dann die Möglichkeit über einen Playbutton ein Grafiktool zu starten welches die Wegpunkte aus der Map liest und entsprechend verarbeitet. Dieses soll in einem zweiten Thread realisiert werden damit die Oberfläche ansprechbar bleibt.Die einzelnen Programmteile sind soweit bereits vorhanden. Die Oberfläche und die Laderoutinen wurden neu geschrieben, das Grafiktool soll aus einer alten Programmversion übernommen werden.
In dieser alten Version hat das Grafiktool sowohl das Laden der Daten als auch das Abspielen übernommen, dies ist aber nicht mehr gewünscht da bei der nächsten Version das Grafiktool ausgetauscht wird.Dass der Grafiktool-thread zunächst beenden werden muss ist mir schon klar. Sollte aber kein Problem sein.