simple multithreading-frage



  • also, ich hab ein kleines verständnisproblem, wenn ich alles verstanden habe ist das wie folgt:

    threadsafe:

    int sth()
    {
       int x = 2345;
       int y = 234;
       x = y = 325;
       return (x+y) /2; 
    }
    

    nicht threadsafe (weil es auf "globale" variablen zugreift, die von allen threads genutzt werden):

    int x = 2345;
    
    int sth()
    {
       int y = 235;
       x = y+3;
       return x+y;
    }
    


  • Ja, richtig.
    Ich kann dabei nur kein Verständnisproblem finden...



  • Beide deine Beispiele sind threadsafe, weil im zweiten Beispiel x immer nur mit dem Wert 238 beschrieben und gelesen wird. Allerdings ist die erste Funktion immer threadsafe, während die zweite Funktion durch eine andere Funktion, die ebenfalls auf das x zugreift, nicht mehr sicher wäre.



  • @nwp3
    Nein, die zweite Funktion ist nicht thread-safe.

    Erstmal ist die Überlegung ob die Funktion für sich genommen thread-safe ist reichlich sinnlos, weil die Frage ziemlich sicher nicht so gemeint war.

    Und zweitens ist sie auch dann nicht thread-safe.
    Normale Zugriffe auf normale Integers sind nicht atomar, und was passiert wenn zwei Threads gleichzeitig (ohne atomare Zugriffe) eine Variable verwenden, wobei mindestens einer schreibt, ist undefiniert.

    Real wird es funktionieren, formal ist es dennoch undefiniert (catch fire semantic).



  • okay



  • hustbaer schrieb:

    Normale Zugriffe auf normale Integers sind nicht atomar[...]

    Doch, sind sie. Sowohl Lesen als auch Schreiben von sogar 64-Bit-Integern auf 64-Bit-Systemen mit Quadcore+.



  • nwp3 schrieb:

    Doch, sind sie.

    Zitat aus dem C++ Standard?



  • cooky451 schrieb:

    nwp3 schrieb:

    Doch, sind sie.

    Zitat aus dem C++ Standard?

    Intel garantierts auf seinen Prozessoren.
    Der Standard allgemein nicht.



  • Ergo hat nwp3 nur sinnloserweise noch mal das wiederholt, was hustbaer schon geschrieben hat.



  • nwp3 schrieb:

    hustbaer schrieb:

    Normale Zugriffe auf normale Integers sind nicht atomar[...]

    Doch, sind sie. Sowohl Lesen als auch Schreiben von sogar 64-Bit-Integern auf 64-Bit-Systemen mit Quadcore+.

    Der C++ Standard garantiert das nicht.

    Intel auch nicht.
    Intel garantiert nur dass die Zugriffe atomar sind wenn sie entsprechend aligned sind. Wenn du einen 32 Bit int von z.B. Adresse 4094 liest ist das so überhaupt gar nicht atomar, nichtmal ansatzweise.



  • Komisch. Das habe ich wohl geträumt.
    Ich hätte bei einem nicht-aligned Zugriff auch einen Bus-error erwartet, aber das ist wohl auch nicht der Fall 😞

    Tut mir leid.



  • @nwp3
    Bei einigen Plattformen bekommst du einen Fehler, bei anderen wird es nur langsamer und ist dann eben nicht mehr atomar.

    x86 erlaubt auf jeden Fall mit den meisten Befehlen Zugriffe auf beliebige Adressen. Wie es bei amd64 aussieht weiss ich erhlich gesagt nicht - ich vermute gleich wie bei x86. Und ich glaube bei Itanium wirst du einen Fehler bekommen.


Anmelden zum Antworten