Réaliser un exécutable à instance unique avec Golang sous Windows
L'exécution de plusieurs instances d'un exécutable peut entraîner des comportements inattendus et des conflits de ressources. Pour éviter cela, vous souhaiterez peut-être limiter votre application Golang à une seule instance active.
Utilisation de Global Mutex pour le contrôle d'instance
Une approche courante pour appliquer l'exécution d'une seule instance se fait grâce à l’utilisation d’un mutex global. Un mutex, ou objet d'exclusion mutuelle, permet à un seul processus d'obtenir un accès exclusif à une ressource partagée à un moment donné. Dans ce cas, notre ressource partagée est l'exécutable en cours d'exécution.
Implémentation sous Windows
Pour créer un mutex global dans Golang pour Windows, vous pouvez utiliser le Fonction CreateMutexW fournie par le kernel32.dll. Cette fonction prend plusieurs arguments, dont le nom du mutex. Pour la compatibilité des sessions entre utilisateurs, il est recommandé de préfixer le nom du mutex avec "Global".
Dans l'extrait de code fourni, une fonction appelée CreateMutex est définie qui résume le CreateMutexW fonction. Vous pouvez utiliser cette fonction pour créer un mutex global en passant un nom unique, tel que "SomeMutexName".
Voici l'extrait de code modifié :
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 } } // mutexName starting with "Global\" will work across all user sessions _, err := CreateMutex("SomeMutexName")
En créant et en définissant un mutex global , votre application Golang peut garantir qu'une seule instance est exécutée à la fois. Si une autre instance tente de s'exécuter, elle sera bloquée jusqu'à ce que l'instance initiale se termine, limitant ainsi l'exécutable à une seule instance active.
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!