STL Queue
-
Hallo,
ist die STL Queue Thread-sicher? D.h. ich würde auf eine globale Queue "gleichzieitig" aus mehreren Threads lesen und schreiben.... (natürlich nicht dasselbe Element schreiben, wie ich gerade lesen will...)
Danke!
-
Hängt von der Implementierung ab. Da der Standard aber keine Threads kennt gehe davon aus das es nicht threadsicher ist.
-
Ich bin nur ein dummer n00b und würde gerne Wissen wie sich Thread-Unsicherheit auswirkt. Links appreciated
-
Knuddlbaer schrieb:
Hängt von der Implementierung ab. Da der Standard aber keine Threads kennt gehe davon aus das es nicht threadsicher ist.
Okay...
aber noch 'ne andere Frage: Ich habe gerade mal ein kleiner Test mit 'ner queue gestartet://--------------------------------------------------------------------------- #pragma hdrstop #include <iostream> #include <conio.h> #include <queue> // STL header file for queue //--------------------------------------------------------------------------- #pragma argsused using namespace std; // Specify that we are using the std namespace int main(int argc, char* argv[]) { queue<int> test_Q; for (int i=0; i<=10; i++) test_Q.push(i); cout << test_Q.size(); for (int i=0; i<=10; i++) { cout << "Element#" << i << ": " << test_Q.front() << endl; test_Q.pop(); } cout << "Is Empty?: " << test_Q.empty(); getch(); } //---------------------------------------------------------------------------
Warum kommt bei diesem Code die Ausgabe:
11Element#0: 0 Element#1: 1 Element#2: 2 Element#3: 3 Element#4: 4 Element#5: 5 Element#6: 6 Element#7: 7 Element#8: 8 Element#9: 9 Element#10: 10 Is Empty?: 1
woher ist die 11 am Anfang?
-
0001 schrieb:
Ich bin nur ein dummer n00b und würde gerne Wissen wie sich Thread-Unsicherheit auswirkt. Links appreciated
www.google.com
Links hab' ich keine, aber Google ist dein Freund
und ähm, meistens bekommst du falsche Werte oder im Extremfall Windows-Exceptions...im Falle einer Unsicherheit...
-
Hallo,
roN schrieb:
woher ist die 11 am Anfang?
war die Frage ernst gemeint? Ich finde jedenfalls diese Anweisung in deinem Code:
cout << test_Q.size();
MfG
-
es wäre Wahnsinn einen Container auf Containerlevel Threadsicher zu machen.
Denn:
jeder Zugriff muss einmal locken - auch wenn man jetzt 10 Zugriffe hintereinander hat, würde des Container jedesmal neu locken und wieder entlocken.Das wäre katastrophal lahm. Deshalb sind die Container nicht Threadsicher.
-
Man würde also den Kontainer einkapseln und den Zugriff dort locken ?!
-
Knuddlbaer schrieb:
Man würde also den Kontainer einkapseln und den Zugriff dort locken ?!
exakt.
Vergleiche mal:Container cont; fill(cont); //mir irgendwelchen daten füllen void fill(Container& cont) { for(int i=0; i<numOfResources; ++i) { cont.push_back(getResource(i)); } }
Wenn wir jetzt auf Containerlevel locken würden - wäre fill extrem lahm. Da wird 'numOfResources' Locks brauchen.
Ein einfaches:
Lock(s); fill(cont); Unlock(s);
lockt dagegen nur unmerklich länger - ist aber um längen schneller.
-
Probe-Nutzer schrieb:
Hallo,
roN schrieb:
woher ist die 11 am Anfang?
war die Frage ernst gemeint? Ich finde jedenfalls diese Anweisung in deinem Code:
cout << test_Q.size();
MfG
Shit, das ist mir jetzt aber peinlich...:( hab' ich auch gerade gesehen... sorryyyyyyyyyyyyyyy