Es ist entscheidend, sicherzustellen, dass jeweils nur eine einzige Instanz einer ausführbaren Datei ausgeführt wird, um mehrere Instanzen desselben Programms zu verhindern dadurch, dass Systemressourcen verbraucht oder Konflikte entstehen. In diesem Artikel wird untersucht, wie Sie mithilfe eines globalen Mutex eine Einzelinstanzausführung in Golang für Windows-Systeme erreichen.
Ein globaler Mutex ist ein Synchronisierungsprimitiv, das mehrere Prozesse ermöglicht oder Threads, um den Zugriff auf eine gemeinsam genutzte Ressource zu teilen, indem der gleichzeitige Zugriff verhindert wird. In diesem Fall stellt die Verwendung eines globalen Mutex namens „SomeMutexName“ über alle Benutzersitzungen hinweg sicher, dass nur eine einzige Instanz der ausführbaren Datei ausgeführt werden kann.
import ( "syscall" "unsafe" ) var ( kernel32 = syscall.NewLazyDLL("kernel32.dll") procCreateMutex = kernel32.NewProc("CreateMutexW") ) func CreateMutex(name string) (uintptr, error) { ret, _, err := procCreateMutex.Call( 0, 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(name))), ) switch int(err.(syscall.Errno)) { case 0: return ret, nil default: return ret, err } } func main() { _, err := CreateMutex("Global\SomeMutexName") if err != nil { return } }
Dieser Code initialisiert die Windows-API-Funktion „CreateMutexW“ aus der Bibliothek „kernel32.dll“ mithilfe von syscall-Paket. Anschließend ruft es diese Funktion mit dem globalen Mutex-Namen auf, um einen benannten Mutex zu erstellen. Wenn die Funktion ohne Fehler zurückkehrt, bedeutet dies, dass keine andere Instanz der ausführbaren Datei ausgeführt wird. Andernfalls bedeutet dies, dass bereits eine andere Instanz ausgeführt wird.
Während der bereitgestellte Code dieses spezielle Problem für Windows-Maschinen behebt, ist es erwähnenswert, dass die Global Mutex-Technik nicht portierbar ist auf allen Plattformen. Jede Plattform verfügt über eigene Mechanismen zur Implementierung der Instanzsperre. Auf Unix-ähnlichen Systemen kann beispielsweise ein „Lockfile“-Ansatz oder die „fcntl“-Funktion mit „F_SETLK“ verwendet werden, um eine ähnliche Funktionalität zu erreichen.
Das obige ist der detaillierte Inhalt vonWie kann ich sicherstellen, dass unter Windows nur eine Instanz einer ausführbaren Go-Datei ausgeführt wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!