ThreadSafe - get-Fuktion



  • Hi,

    wenn man eine Klasse hat, die z.B. eine get-Funktion anbietet:

    int getNumber() { return number; }
    

    Wie macht man das dann Threadsafe? Mutex, etc. kommt hier ja nicht in Frage, da nach dem return kein Code mehr ausgeführt wird.
    Ich müsste also über Referenzen gehen, oder?

    void getNumber(int& num) { num = number; }
    

    Nun müsste ich zwischen der Zuweisung eben Lock und Unlock aufrufen, ja?

    void getNumber(int& num) { lock();  num = number; unlock(); }
    

    Und darauf greife ich dann so zu:

    int val;
    
    myClass.getNumber(val);
    

    Aber auf keinen(!) Fall so:

    int& val
    
    myClass.getNumber(val);
    

    Habe ich das richtig verstanden oder handel ich mir damit Probleme ein?

    Vielen Dank,
    Paty



  • Dein letztes Beispiel geht sowieso nicht, da an eine Referenz sofort ein Objekt gebunden werden muss; sie kann nicht "in der Luft schweben".

    Ja, mach es mit Referenzen. So hab ich das auch in Erinnerung.
    Aber ich frage mich, warum man reine Lesezugriffe synchronisieren muss?!



  • int& val;
    
    myClass.getNumber(val);
    

    Das geht schonmal gar nicht.

    Man könnte es auch so machen:

    int getNumber()
    {
    	lock();
    	int r = number;
    	unlock();
    	return r;
    }
    

    Wie man das am besten macht, würde mich auch mal interessieren.





  • TyRoXx schrieb:

    int& val;
    
    myClass.getNumber(val);
    

    Das geht schonmal gar nicht.

    Man könnte es auch so machen:

    int getNumber()
    {
    	lock();
    	int r = number;
    	unlock();
    	return r;
    }
    

    Aber r muß volatile sein sosnt wirds wegoptimiert



  • general bacardi schrieb:

    Aber r muß volatile sein sosnt wirds wegoptimiert

    Also zumindest wenn man das WinAPI benutzt (Interlocked Funktionen, Critical Sections...), braucht man kein volatile. Es kümmert sich dann um die "memory barriers".



  • general bacardi schrieb:

    Aber r muß volatile sein sosnt wirds wegoptimiert

    Wie "Check0r" schon schrieb: r muss nicht volatile sein.

    Und normalerweise macht man sowas mit einer "scoped lock" Klasse, womit sich der Code zu folgendem reduziert:

    int foo()
    {
        my_scoped_lock<my_mutex_type> lock(mutex); // hier passiert "mutex.lock()"
        return number;
    } // hier passiert "mutex.unlock()", also NACHDEM der returnwert kopiert wurde. und alles ist gut. wie durch magie :)
    

Anmelden zum Antworten