none
Multithreading - allgemeine Frage RRS feed

  • Frage

  • Hallo und guten Tag,

    in der Dokumentation (Monitor.TryEnter) findet sich folgendes Codebeispiel:

    ...

    // Lock the queue and dequeue an element.
    public T Dequeue()
       {
          T retval;
          // Request the lock, and block until it is obtained.
          Monitor.Enter(m_inputQueue);
          try
          {
             // When the lock is obtained, dequeue an element.
             retval = m_inputQueue.Dequeue();
          }
          finally
          {
             // Ensure that the lock is released.
             Monitor.Exit(m_inputQueue);
          }
          return retval;
       }


    Verständnisfrage:

    Ist folgendes Szenario vorstellbar:

    Thread 1 hat Monitor.Exit gerade abgearbeitet und bevor "retval" zurückgegeben
    wurde (also zwischen den beiden Schritten) ruft ein zweiter Thread die Methode
    auf und nullt retval mit der Konsequenz, dass Thread 1 "null" liefert?

    Oder hat "retval" bei jedem Eintritt in die Methode in jedem Fall eine eigene "Instanz"?

    Gruß
    Klaus


    • Bearbeitet K. Pater Freitag, 12. Juni 2015 09:59
    Freitag, 12. Juni 2015 09:56

Antworten

  • Hi Klaus,
    retval ist eine Verweisvariable, die bei jedem Eintritt in die Methode "Dequeue" im Stack angelegt wird. Das bedeutet, dass jeder Aufruf der Methode "Dequeue" einen separaten Zeiger in der Variablen "retval" enthält. Um zu verhindern, dass Zeiger verloren gehen, muss der Aufruf der Methode "Dequeue" richtig passen.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort vorgeschlagen Peter Fleischer Freitag, 12. Juni 2015 11:42
    • Als Antwort markiert K. Pater Freitag, 12. Juni 2015 12:16
    Freitag, 12. Juni 2015 10:04
  • Hi Klaus,
    T muss zum Typ der Objekte in "m_inputQueue" passen. Aus diesem Grund ist die Typisierung der Methode ohne den genauen Hintergrund zu kennen, fragwürdig.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks

    Freitag, 12. Juni 2015 10:21

Alle Antworten

  • Hi Klaus,
    retval ist eine Verweisvariable, die bei jedem Eintritt in die Methode "Dequeue" im Stack angelegt wird. Das bedeutet, dass jeder Aufruf der Methode "Dequeue" einen separaten Zeiger in der Variablen "retval" enthält. Um zu verhindern, dass Zeiger verloren gehen, muss der Aufruf der Methode "Dequeue" richtig passen.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort vorgeschlagen Peter Fleischer Freitag, 12. Juni 2015 11:42
    • Als Antwort markiert K. Pater Freitag, 12. Juni 2015 12:16
    Freitag, 12. Juni 2015 10:04
  • Hallo Peter,

    herzlichen Dank für die rasche Antwort.

    Könnte "T" keinen Werte-Typ (int, bool) annehmen? Oder wäre das egal?

    Gruß
    Klaus

    Freitag, 12. Juni 2015 10:13
  • Hi Klaus,
    T muss zum Typ der Objekte in "m_inputQueue" passen. Aus diesem Grund ist die Typisierung der Methode ohne den genauen Hintergrund zu kennen, fragwürdig.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks

    Freitag, 12. Juni 2015 10:21