Maison > développement back-end > Golang > le corps du texte

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

Barbara Streisand
Libérer: 2024-11-27 09:24:15
original
389 Les gens l'ont consulté

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
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal