Mutex frage

  • Hallo,
    ich hatte gestern Abend eine nette Unterhaltung mit einem Freund über Mutex etc.
    Dies ist für mich was ganz neues und eigentlich eine sehr nette Idee.
    So, nun habe ich ein Script im Internet gefunden womit man ein Mutex überprüfen kann, erstellen und schliessen.
    Aber was ist, wenn ich ein bereits exestierenden Mutex schliessen möchte das von einem anderem Programm erstellt wurde? Gibt es dafür auch irgend was?
    Ich habe einfach versucht das Überprüfungsscript und das Schliesscript zusammen zu fassen, leider bekomme ich beim schliessen eine 0, also ein Fehler wieder.
    Könnt ihr mir da vielleicht Helfen?

    [autoit]

    $kill = _KillMutex("ThisIsATestMutix")
    MsgBox (0,"Mutex",$kill)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _KillMutex ($szMutexName)
    Local $hMutex = DllCall("Kernel32.dll", "hwnd", "OpenMutex", "int", 0x1F0001, "int", 1, "str", $szMutexName)
    Local $aGLE = DllCall("Kernel32.dll", "int", "GetLastError")
    If IsArray($aGLE) And $aGLE[0] = 127 Then
    Local $aRM = DllCall("kernel32.dll", "int", "ReleaseMutex", "hwnd", $hMutex[0])
    If IsArray($aRM) And $aRM[0] > 0 Then Return 1 ; Erfolgreich
    Return -1 ; Konnte nicht getötet werden
    EndIf
    Return 0 ; Exestiert nicht
    EndFunc

    [/autoit]


    mfg Freaky

  • Jedes Programm kann nur seine eigenes Mutex-Handle schließen, genau wie bei Dateien. Der Mutex ist ja auch gerade dazu gedacht, den Zugriff auf eine Ressource mutually exclusive zu gestalten

  • Zitat

    Ich sehe nicht so wirklich den Vorteil darin, Mutexe in AutoIt zu verwenden.

    so kanns gehn....
    ICH sehe nicht so wirklich den Vorteil darin ÜBERHAUPT Mutexe zu verwenden 8o

    Mal ganz im Ernst, ich verteile Aufgaben auf sämtliche Cores der Prozessoren bzw. Grafikkarten ohne mir überhaupt Gedanken über Mutexe zu machen, da das Threadmanagement in OpenCL implementiert ist. Starte Programm auf allen verwendbaren Cores, und benutze barrier(), um sicherzustellen, dass ALLE anderen Threads bis zu dieser Stelle abgearbeitet wurden. Erschlägt 99% der Anwendungen....

    Speicher/Dateien/Datenbanken LESEN ist Dank Lock() kein Thema, beim Schreiben genauso....
    Gleichzeitig (sic) Lesen und Schreiben ist imho sowieso eine Lachnummer, bisher sieht das in 99% aller Fälle programmtechnisch so aus, dass die kritischen Threads sicherheitshalber alle angehalten werden. Ob man bei z.B. 16 Threads mit unterschiedlichen Prioritäten noch übersichtlich Mutexen kann, wage ich ehrlich gesagt zu bezweifeln....Man merkt deutlich, dass die programmtechnische Umsetzung aus einer Ära kommt, als 2-Prozessormaschinen State of the Art waren. EIN blockender Thread oder Deadlock schmeisst doch das gesamte System um!

    Der Aufwand wäre mir ehrlich gesagt zu hoch, da würde ich mich primär um andere Optimierungsmaßnahmen kümmern ;)

  • Ach so. Darin sehe ich aber noch weniger Sinn. Wozu will man denn Sicherheitsmethoden anderer Prozesse aushebeln?


    Weil es halt Programme gibt, die verhindern, dass man sie mehrmals aufruft :P...
    Das kann bei diverser Software sein und ist bei Spielen auch weit verbreitet, z.B....

    Will man einen Account nutzen, um z.B. immer beim Aktionshaus zu sein und einem zum Zocken, gibt das oft Probleme, weil die Hersteller das verhindern wollen und nur eine Instanz des Programmes gestatten.

    Zumin. geh ich stark davon aus, dass das auch "Mutex" ist, weil mir das nu auch nicht soooviel gesagt hat und ich mich nie mit beschäftigt habe xD...

    Aber lasse mich gern belehren xD... Weiß nur, dass Mutex ja verhindern sollen, dass es Diskrepanzen gibt, dadurch, dass auf bestimme "Dinge" mehrfach zugegriffen werden kann?! :D


    LG,
    Aca

    *Edit*
    Andy: Ja sorry, meinte ich auch xD... Vllt. nicht perfekt ausgedrückt :P!

    Einmal editiert, zuletzt von Acanis (18. August 2012 um 20:15)

  • Zitat

    Weiß nur, dass Mutex ja verhindern sollen, dass es Diskrepanzen gibt, dadurch, dass auf bestimme "Dinge" mehrfach zugegriffen werden kann?!

    nein, nicht mehrfach sondern gleichzeitig.
    Dann muss z.B. sichergestellt sein, dass bei 3 Threads, die gleichzeitig einen bestimmten Speicherbereich bearbeiten (lesen+verändern+schreiben) die Daten nach jedem Lese/Schreibzyklus konsistent sind. Heisst in diesem Fall, solange EIN Thread Daten bearbeitet, müssen die anderen beiden warten....bearbeiten die Threads unterschiedliche Speicherbereiche, dann können sie gleichzeitig arbeiten.
    Um festzustellen, ob ein Programm mehrfach gestartet wurde, benutzt man sicherlich kein Mutex :D