同じプログラムの複数のインスタンスを防ぐには、実行可能ファイルのインスタンスを一度に 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 サイトの他の関連記事を参照してください。