首页 >后端开发 >Golang >如何确保 Go 可执行文件只有一个实例在 Windows 上运行?

如何确保 Go 可执行文件只有一个实例在 Windows 上运行?

Barbara Streisand
Barbara Streisand原创
2024-11-27 09:24:15468浏览

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

在 Go for Windows 中限制为单个可执行文件实例

确保一次仅运行一个可执行文件实例对于防止同一程序出现多个实例至关重要以免消耗系统资源或产生冲突。本文探讨了如何使用全局互斥体在 Golang for Windows 系统中实现单实例执行。

用于单实例控制的全局互斥体

全局互斥体是一种允许多个进程的同步原语或线程通过防止并发访问来共享对共享资源的访问。在这种情况下,在所有用户会话中使用名为“SomeMutexName”的全局互斥体可确保只有可执行文件的单个实例可以运行。

代码实现

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

解决方案的架构

此代码使用 syscall 包从“kernel32.dll”库初始化 Windows API 函数“CreateMutexW”。然后,它使用全局互斥体名称调用此函数来创建命名互斥体。如果该函数返回且没有错误,则表明没有可执行文件的其他实例正在运行。否则,这意味着另一个实例已经在运行。

到其他平台的可移植性

虽然提供的代码解决了 Windows 计算机的这个特定问题,但值得注意的是全局互斥技术是不可移植的跨所有平台。每个平台都有自己的实现实例锁定的机制。例如,在类 Unix 系统上,可以采用“lockfile”方法或带有“F_SETLK”的“fcntl”函数来实现类似的功能。

以上是如何确保 Go 可执行文件只有一个实例在 Windows 上运行?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn