Maison >développement back-end >Golang >Comment puis-je garantir qu'une seule instance d'un exécutable Go s'exécute sous Windows ?

Comment puis-je garantir qu'une seule instance d'un exécutable Go s'exécute sous Windows ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-27 09:24:15469parcourir

How Can I Ensure Only One Instance of a Go Executable Runs on Windows?

Restriction à une seule instance d'exécutable dans Go pour Windows

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.

Mutex global pour le contrôle d'instance unique

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.

Implémentation du code

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
    }
}

Architecture de la solution

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.

Portabilité vers d'autres plates-formes

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn