Refcountet smartpointer race condition



  • Hi,

    ich habe mal eine Frage ich versuche gerade rauszufinden wie der std::shared_ptr<>
    funktioniert und im DTOR vom shared ptr wird _Decref() aufgerufen und decref macht das:

    void _Decref()
    		{	// decrement use count
    		if (_MT_DECR(_Mtx, _Uses) == 0)
    			{	// destroy managed resource, decrement weak reference count
    			_Destroy();
    			_Decwref();
    			}
    		}
    

    Ist die Abfrage nicht eine Race Condition? Was passiert, wenn nach der Abfrage (_== 0) in einem anderen Thread gerade ein Objekt erstellt wird bevor _Destroy() und _Decwref() aufgerufen wird?
    Müsste die Funktion nicht mit einem mutex geschuetzt werden oder wenigsten volatile definiert werden?
    Ich bin gerade ein wenig verwirrt, vielleicht kann ja jemand Licht ins Dunkel bringen.

    P.S.:Visual Studio 2013



  • Ruvi schrieb:

    Ist die Abfrage nicht eine Race Condition? Was passiert, wenn nach der Abfrage (_== 0) in einem anderen Thread gerade ein Objekt erstellt wird bevor _Destroy() und _Decwref() aufgerufen wird?

    Das geht nicht. Wenn du nach _MT_INCR googlest stellst du fest, dass das eine lockfreie Dekrementierung vornimmt. Das hat den Effekt von

    lock()
    --Uses;
    int the_uses = Uses;
    unlock();
    if (the_uses==0) {
     _Destroy();
     _Decwref();
    }
    

    Wo soll da ein Objekt erstellt werden können? Vor dem lock ist es egal. Nach dem unlock ist uses==0, was es verbietet, das Objekt zu erstellen.



  • mutex_inkrement schrieb:

    Wo soll da ein Objekt erstellt werden können? Vor dem lock ist es egal. Nach dem unlock ist uses==0, was es verbietet, das Objekt zu erstellen.

    Ah, mir war nicht bewusst, das uses==0 eine Konstruktion verhindert, aber macht Sinn, danke.



  • Noch eine interessante Info warum der weak reference count runtergezählt wird: https://www.reddit.com/r/cpp/comments/3eia29/stdshared_ptrs_secret_constructor/ctfeh1p



  • Ruvi schrieb:

    ... wenigsten volatile definiert werden?

    volatile hat nichts mit Threads zu tun.


Anmelden zum Antworten