none
Aus der App-Entwickler-Hotline: Paralleler Zugriff auf kritische Bereiche RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen,

    heute wurde uns bei der App-Entwickler-Hotline unter anderem folgende Frage gestellt:

    Ich habe zwei parallele Operationen (Threads), die beide beim Zugriff auf eine Variable in eine Konkurrenzsituation gelangen. Wie kann ich bestimmen, dass nur ein Thread gleichzeitig Zugriff auf einen bestimmten Bereich hat?

    Unsere Antwort bzw. unser Lösungsvorschlag darauf war:

    Bei parallelen Operationen kommt es oft vor, dass mehrere Threads in einen Codebereich vordringen möchten, was, je nach Zeitzuweisung vom Scheduler, unterschiedliche Ergebnisse zur Folge haben kann.

    Dieses Problem lässt sich mit Semaphoren lösen. Einen durch eine Semaphore abgedeckten Bereich können nur eine vorher definierte Anzahl von Threads betreten. Möchte ein Thread Zugriff auf den geschützten Bereich und es hat bereits die definierte maximale Anzahl von Threads Zugriff auf den kritischen Bereich, so wird der Thread in eine Warteschlange eingereiht und erhält, sobald ein anderer Thread den Bereich verlässt, selbst Zugriff.

    Weitere Informationen und Beispiele befinden sich in der MSDN Dokumentation unter [1]. Eine vereinfachte Version einer Semaphore, bei dem nur ein Thread Zugriff auf einen Bereich haben kann, ist der Mutex. Die Dokumentation hierzu ist unter [2] zu finden. Allgemeine Informationen zu Threads befinden sich unter [3].

    [1] Semaphore-Klasse
    [2] Mutex-Klasse
    [3] Threading (C# und Visual Basic)

    Wir hoffen, vielen Besuchern der MSDN Foren durch das Posten dieses Problems und einer möglichen Lösung weiterhelfen zu können.

    Viele Grüße,
    Torsten Hanke
    App-Entwickler-Hotline für MSDN Online Deutschland

    Disclaimer:
    Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
    Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die App-Entwickler-Hotline: http://www.msdn-online.de/Hotline
    MSDN Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    Es gelten für die App-Entwickler-Hotline und dieses Posting diese Nutzungsbedingungen, Hinweise zu MarkenzeichenInformationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die App-Entwickler-Hotline.


    Mittwoch, 14. November 2012 13:31

Alle Antworten

  • Hallo zusammen,

    um eine Variable vor gleichzeitigen Zugriff zu schützen, reicht i. a. eine geschützter Bereich über die Monitor-Klassse aus, die durch die lock Anweisung (bzw. SyncLock in Visual Basic) zur Verfügung gestellt wird. Das ist i. a. performanter als ein Semaphor oder Mutex.

    Für skalare Variablen kann die Operationen der Interlocked Klasse verwenden, was weitere Verbesserungen bringen kann.

    Weiteres siehe Threading in C# Part 2: Basic Synchronization

    Gruß Elmar

    Mittwoch, 14. November 2012 14:52
    Beantworter