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 😞


Log in to reply