Frage zu einem Stack der thread-safe sein soll



  • Hi,
    angenommen, man hat einen Stack, der thread-safe ist, dann kann man ihn wie folgt benutzen:

    while (!stackEmpty(&stack))
    {
        stackPop(&stack, addr);
    }
    

    Die Funktionen mögen zwar in der Stack-Implementierung selbst thread-safe sein, aber nach der Abfrage stackEmpty() kann es ja einen Kontextwechsel zu einem anderen Thread (Thread 2) geben, der dann das letzte Element holt, so dass bei einem Kontextwechsel zu Thread 1 zurück, es zu Buffer Overflow kommt.

    Frage: Wie handhaben Bibliotheken dieses Problem? 😕

    Danke im Voraus!

    L. G.
    Steffo



  • Steffo schrieb:

    Die Funktionen mögen zwar in der Stack-Implementierung selbst thread-safe sein, aber nach der Abfrage stackEmpty() kann es ja einen Kontextwechsel zu einem anderen Thread (Thread 2) geben, der dann das letzte Element holt, so dass bei einem Kontextwechsel zu Thread 1 zurück, es zu Buffer Overflow kommt.

    richtig

    Steffo schrieb:

    Frage: Wie handhaben Bibliotheken dieses Problem? 😕

    In der Regel gar nicht.



  • Was heißt in der Regel? Geht das überhaupt nicht?
    Wie macht es Java? Dort gibt es Thread Safe Collections.
    Wie ist es in C++? Gibt es keine Thread Safe Libs, die das Problem abfangen?



  • Steffo schrieb:

    Wie ist es in C++? Gibt es keine Thread Safe Libs, die das Problem abfangen?

    Kaum.
    Die Lösung ist aber wohl offensichtlich: eine try_pop() Funktion.



  • Steffo schrieb:

    Was heißt in der Regel? Geht das überhaupt nicht?

    Was? Klar, aber die Synchronisation muss dort stattfinden wo der Container verwendet wird. Der Container selbst hat keine Chance zu wissen, wie er verwendet wird.

    Steffo schrieb:

    Wie macht es Java? Dort gibt es Thread Safe Collections.

    Hast du da mal ein Beispiel dazu wie sowas in Java aussehen soll? Ich find nämlich nix brauchbares dazu...

    Steffo schrieb:

    Wie ist es in C++? Gibt es keine Thread Safe Libs, die das Problem abfangen?

    Was genau verstehst du unter thread-safe? Natürlich gibt es thread-safe Container, wo z.B. eine Einfügeoperation atomar ist.



  • Aaaalso gut, ich habs mal mit try_pop() gelöst! 🙂

    Danke an euch beide! 🙂

    L. G.
    Steffo


Anmelden zum Antworten