Wie funktioniert eine while-Schleife? (Auf der Suche nach einem mir unerklärlichen Fehler)



  • Eigentlich dachte ich zu wissen wie eine while-Schleife funktioniert. Allerdings bin ich auf einen Fehler in meinem Programm gestoßen, den ich mir nicht erklären kann. Die scheinbar funktionierende Lösung des Problems kann ich mir allerdings noch viel weniger erklären.

    Etwa so sieht der Code aus in dem der Fehler auftritt:

    barrier(); //anderer thread setzt *globale_variable vor der barrier
    while(globale_variable != NULL)
    {
       mache_irgendwas(globale_variable);
       barrier();
       //anderer thread setzt *globale_variable hier
       barrier();
    }
    

    In barrier() werden die laufenden threads mit einander synchronisiert, sie kommen erst an barrier() vorbei, wenn alle anderen threads barrier() erreicht haben.
    *globale_variable ist vor Eintritt in die while Schleife nicht NULL. Trotzdem kommt das Programm nie in die while-Schleife rein. Ich nehme an, der thread hängt sich hier mit einem Speicherzugriffsfehler auf.
    Folgender Code, der meiner Meinung nach eigentlich genau das gleiche machen sollte, scheint allerdings problemlos zu funktionieren:

    barrier(); //anderer thread setzt *globale_variable vor der barrier
    while(1)
    {
       if(globale_variable == NULL)
          break;
       mache_irgendwas(globale_variable);
       barrier();
       //anderer thread setzt *globale_variable hier
       barrier();
    }
    

    Kann mir das jemand erklären? Wo könnte der Fehler sonst liegen?



  • Welchen Wert hat globale_variable vor dem ersten Aufruf von barrier()?



  • Vor dem ersten Aufruf von barrier() ist globale_variable undefiniert.



  • Gruum schrieb:

    Vor dem ersten Aufruf von barrier() ist globale_variable undefiniert.

    Globale Variablen werden mit 0 initialisiert, wenn nichts anderes angegeben wird.

    Hast du globale_variable als volatile definiert?



  • nix



  • DirkB schrieb:

    Gruum schrieb:

    Vor dem ersten Aufruf von barrier() ist globale_variable undefiniert.

    Globale Variablen werden mit 0 initialisiert, wenn nichts anderes angegeben wird.

    Hast du globale_variable als volatile definiert?

    globale_variable ist nicht wirklich eine globale Variable, es haben nur alle threads Zugriff auf sie. Es macht allerdings hier keinen unterschied, wenn ich sie mit 0 initialisiere.
    Ich hatte globale_variable nicht als volatile definiert. Sie als volatile zu definieren, hat jetzt aber auch nicht geholfen.


Log in to reply