Il est crucial de garantir qu'une seule instance d'un exécutable s'exécute à la fois pour empêcher plusieurs instances du même programme de consommer des ressources système ou de créer des conflits. Cet article explique comment réaliser une exécution à instance unique dans Golang pour les systèmes Windows à l'aide d'un mutex global.
Un mutex global est une primitive de synchronisation qui permet plusieurs processus. ou des threads pour partager l'accès à une ressource partagée en empêchant l'accès simultané. Dans ce cas, l'utilisation d'un mutex global nommé "SomeMutexName" dans toutes les sessions utilisateur garantit qu'une seule instance de l'exécutable peut s'exécuter.
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 } }
Ce code initialise la fonction API Windows "CreateMutexW" de la bibliothèque "kernel32.dll" à l'aide de l'appel système emballer. Il appelle ensuite cette fonction avec le nom du mutex global pour créer un mutex nommé. Si la fonction renvoie sans erreur, cela indique qu’aucune autre instance de l’exécutable n’est en cours d’exécution. Sinon, cela signifie qu'une autre instance est déjà en cours d'exécution.
Bien que le code fourni résolve ce problème spécifique pour les machines Windows, il convient de noter que la technique Global Mutex n'est pas portable. sur toutes les plateformes. Chaque plateforme dispose de ses propres mécanismes de mise en œuvre du verrouillage d'instance. Par exemple, sur les systèmes de type Unix, une approche « lockfile » ou la fonction « fcntl » avec « F_SETLK » peut être utilisée pour obtenir une fonctionnalité similaire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!