Frage zu atomics



  • Hallo,

    ich kämpfe mit atomaren Operationen und habe Verständnisfrages zu unterem code:

    1. Wenn ich die member eines struct atomar mache, und 2 threads das Gleiche myStruct verwenden, ist dann immer gewährleistet dass jeder Thread den aktuellen Wert im struct sehen bei einem lessen von myInt z.B.?

    2. So wie ich das sehe ist der Zugriff auf ein functionPointer atomar (zweiter member) und somit sollte der auch thread-safe sein, richtig?

    Danke

    typedef struct myStruct {
    		std::atomic<int> myInt;
    		std::atomic<my_handle>		fpMyHandle;	// Pointer auf Fkt.
    }
    


  • zumbo schrieb:

    1. Wenn ich die member eines struct atomar mache, und 2 threads das Gleiche myStruct verwenden, ist dann immer gewährleistet dass jeder Thread den aktuellen Wert im struct sehen bei einem lessen von myInt z.B.?

    definiere "aktueller Wert"

    zumbo schrieb:

    2. So wie ich das sehe ist der Zugriff auf ein functionPointer atomar (zweiter member) und somit sollte der auch thread-safe sein, richtig?

    Nur weil etwas atomar ist, heißt noch lange nicht, dass der Code, der mit dem atomaren Dings arbeitet auch threadsafe ist...



  • definiere "aktueller Wert"

    der aktuellste Wert vom gesamten Verlauf.

    Nur weil etwas atomar ist, heißt noch lange nicht, dass der Code, der mit dem atomaren Dings arbeitet auch threadsafe ist...

    stimmt, aber ist denn wenigstens der zugriff auf das Dings thread-safe?



  • zumbo schrieb:

    definiere "aktueller Wert"

    der aktuellste Wert vom gesamten Verlauf.

    Zwei Dinge passieren gleichzeitig. Welches der beiden passiert später? 😉

    zumbo schrieb:

    stimmt, aber ist denn wenigstens der zugriff auf das Dings thread-safe?

    Ja, die Frage ist: Was hilft dir das?



  • 🙂 ist denn der Zugriff auf myStruct thread-safe?



  • Das hängt davon ab, wie dieser "Zugriff" aussieht...



  • Wenn der Zugriff von 2 threads "gleichzeitig" passiert wie folgt:

    // thread 1 führt zu Zeitpunkt x aus:
    mystruct.myInt = 7;
    
    // thread 2 führt zu Zeitpunkt x aus:
    mystruct.myInt = 8;
    

    ist vermutlich ein data race auf myStruct enthalten, richtig?



  • Nö, mystruct.myInt hat in dem konkreten Beispiel dann aus Sicht beider Threads entweder den Wert 7 oder 8...Die Frage ist, was dir das bringt...

    Btw: typedef struct ist etwas, das man in C vielleicht macht, aber nicht in C++...


Log in to reply