Announcement

Collapse
No announcement yet.

Threads und lokale Variablen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Threads und lokale Variablen

    Wenn mehrere Threads gleichzeitig die gleiche 'globale' Funktion aufrufen und diese Funktion lokale Variablen besitzt, werden dann pro Thread neuer Speicherplatz pro lokale Variable reserviert oder kann es zu Problemen kommen, weil beide Threads die gleichen lokalen Variablen benutzen?

    Also z.B.:
    Code:
    void blubb(){
      int a = 0;
      ... (rechenzeit)
      a = 1
      ... (rechenzeit)
      if (a  == 0){
        //Soll nie erreicht werden
      }
    }
    Kann es da passieren, dass das Statement bei der If-Verzweigung wahr ist, wenn zwei Threads gleichzeitig diese Funktion aufrufen? Von was ist das abhängig?

  • #2
    irgendwo ist da konzeptionell was falsch.

    Soll nie erreicht werden???
    Christian

    Comment


    • #3
      Joa, da der Wert ja vorher auf 1 gesetzt wird sollte die Überprüfung a == 0 immer falsch sein, es sei denn ein anderer Thread kann auch auf die Variable a zugreifen.

      Wie ist es denn nun? Erzeugt jeder Thread seine eigene lokale Variable oder benutzen alle Threads die Gleiche?

      Comment


      • #4
        Dazu müsste man wissen was da oben der Thread ist, wo er aufgerufen wird. Schau dir "Synchronized" an. Wenn das da oben dein Hauptprogramm ist, erzeugt ein Thread da keine Variablen
        Christian

        Comment


        • #5
          In der Funktion selbst wird kein Thread erzeugt. Es sind vielmehr sagen wir mal 1000 Threads, die sich alle unabhängig voneinander durch das Programm arbeiten und die oben zitiere Funktion ist eine "globale Funktion" auf die alle Threads Zugriff haben.

          Synchronized verhindert, das zwei Threads gleichzeitig eine Funktion aufrufen, oder? Wird das in diesem Fall benötigt?

          Comment


          • #6
            Da die Variablen lokal innerhalb einer Funktion definiert sind, liegen sie auf dem Stack. Somit hat jeder thread seine "eigenen" Variablen wenn er diese Funktion aufruft.
            Um den gleichzeitigen Zugriff auf Variablen, Strukturen... zu vermeiden gibts andere Moeglichkeiten.
            z.B. TCriticalSection

            Comment


            • #7
              Naja, wenn jeder Thread seine eigenen Variablen benutzt, dann kann ein gleichzeitiger Zugriff nicht entstehen und es gibt kein Problem. Synchronized and CriticalSection würden also nur unnötig Rechenzeit verbrauchen.

              Comment


              • #8
                Sorry. Da hast du was verwechselt.

                In deinem Beispiel hast du lokale Variablen deffiniert. Diese liegen auf dem Stack. Jeder Thread, der diese Funktion aufruft hat sienen eigenen Stack.

                Benutzt du z.B statische oder Globale Variablen, so liegen diese nicht auf dem Stack. Hierbei musst du dann selbst dafuer sorgen das ein gleichzeitiger Zugriff vermieden wird. Dafuer brauchst du dann geeignette Massnahmen. Z.B CriticalSection..

                Comment


                • #9
                  Jo mein ich ja. Also lokale Variablen sind threadsicher sozusagen. :-)

                  Comment

                  Working...
                  X