ホームページ  >  記事  >  バックエンド開発  >  Windows 上で Go 実行可能ファイルのインスタンスが 1 つだけ実行されるようにするにはどうすればよいですか?

Windows 上で Go 実行可能ファイルのインスタンスが 1 つだけ実行されるようにするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-27 09:24:15395ブラウズ

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

Go for Windows での実行可能ファイルの単一インスタンスへの制限

同じプログラムの複数のインスタンスを防ぐには、実行可能ファイルのインスタンスを一度に 1 つだけ実行することが重要ですシステムリソースの消費や競合の発生を防ぎます。この記事では、グローバル ミューテックスを使用して、Windows システム向け Golang で単一インスタンスの実行を実現する方法について説明します。

単一インスタンス制御用のグローバル ミューテックス

グローバル ミューテックスは、複数のプロセスを許可する同期プリミティブです。またはスレッドを使用して、同時アクセスを防止して共有リソースへのアクセスを共有します。この場合、すべてのユーザー セッションで「SomeMutexName」という名前のグローバル ミューテックスを使用すると、実行可能ファイルのインスタンスが 1 つだけ実行されるようになります。

コードの実装

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

ソリューションのアーキテクチャ

このコードは、「kernel32.dll」ライブラリから Windows API 関数「CreateMutexW」を初期化します。 syscall パッケージを使用します。次に、グローバル ミューテックス名を指定してこの関数を呼び出し、名前付きミューテックスを作成します。関数がエラーなしで戻った場合は、実行可能ファイルの他のインスタンスが実行されていないことを示します。それ以外の場合は、別のインスタンスがすでに実行されていることを意味します。

他のプラットフォームへの移植性

提供されたコードは Windows マシン向けのこの特定の問題に対処していますが、Global Mutex 技術は移植性がないことに注意してください。すべてのプラットフォームにわたって。各プラットフォームには、インスタンス ロックを実装するための独自のメカニズムがあります。たとえば、Unix 系システムでは、「lockfile」アプローチまたは「F_SETLK」を使用した「fcntl」関数を使用して、同様の機能を実現できます。

以上がWindows 上で Go 実行可能ファイルのインスタンスが 1 つだけ実行されるようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。