alterantive für CRITICAL_SECTION?



  • hallo

    ich wollte mal fragen ob es irgenteine möglichkeit gibt, softwareseitig
    zu verhindern, dass 2 datenbereiche gleichzeitig beschrieben werden.

    die sync mit critical_sections erzeugt einfach zu viel overhead..

    irgentwas mit flags vllt



  • Was für Datenbereiche?
    Was für CPU?
    Wie sieht der Anwendungsfall genau aus/was willst du machen?

    Eine CRITICAL_SECTION ist die schnellste unter Windows verfügbare "generische" Mutex (generisch im Sinn von allgemein verwendbar, nicht spezialisiert). Selbstgebastelte (ebenso generische) Lösungen (die auch in allen Fällen korrekt funktionieren) können vielleicht um ein paar Prozent schneller sein, aber viel geht nicht. Der grösste Teil geht beim InterlockedCompareExchange drauf, und zwar für's "umlagern" der Cache-Line.

    Diverse Spielereien mit Flags mögen in Tests so aussehen als ob sie korrekt funktionieren, unter Last und mit Murphys Hilfe werden sich die Fehler aber zeigen.

    Wenn du deine Anforderungen genauer beschreibst kann man dir vielleicht helfen.


  • Mod

    Der Overhead einer Crticial-Section, die sofort gesperrt werden kann, geht gegen null!

    Was ist Dein Problem. Zeig doch mal Code wie Du es machst?



  • Du kannst bei initialisieren der CS auch "InitializeCriticalSectionAndSpinCount" verwenden, das macht die CS auf Multi-Core-Rechnern *wesentlich* schneller! Erhöht aber die CPU-Auslastung.
    Siehe auch Doku...



  • hab mir mal TryEnterCriticalSection angeguckt und damit hat sich das problem gelöst. wollte einfach nicht das der thread schlafen geht. mein fehler 🙄



  • Martin Richter schrieb:

    Der Overhead einer Crticial-Section, die sofort gesperrt werden kann, geht gegen null!

    Die Interlocked Operationen sind alle relativ langsam. Vor allem wenn die Cache-Line in der der Wert liegt dauernd zwischen CPUs/Cores wechselt. Lock-Contention macht die Sache natürlich noch um Grössenordnungen schlimmer.



  • Hallo.

    Ich lese da was von "2 Datenbereichen". Machst Du IPC? Wieviele Cores hat deine CPU (1 Core = 1 Thread)?

    CriticalSections wurden von MS gemacht, um sie mit sekundären Threads zu benutzen, die alle im Addressraum des primären (Main-) Threads sind.
    Sollen Addressraumgrenzen überschritten werden (->IPC), müssen Mutexe benutzt werden. Diese sollten einen NAMEN haben! Ganz wichtig! Den Namen müssen natürlich alle beteiligten Prozesse ( = MainThreads) kennen.

    Also: IPC?

    "Threadsafe programming" hat immer seinen Preis.

    Gruß

    Dipl


Anmelden zum Antworten