首页 > 后端开发 > Golang > 如何使用全局互斥体确保 Go 应用程序只有一个实例在系统范围内运行?

如何使用全局互斥体确保 Go 应用程序只有一个实例在系统范围内运行?

Linda Hamilton
发布: 2024-11-30 05:32:25
原创
644 人浏览过

How to Ensure Only One Instance of a Go Application Runs System-Wide Using a Global Mutex?

使用全局互斥体限制 Golang 可执行文件的单个实例

强制执行应用程序的单个实例是常见要求。 Golang 使用sync.Mutex 包提供了一个方便的解决方案。但是,此方法仅适用于单个进程。要将应用程序限制为跨系统的单个实例,需要利用全局互斥体。

在 Windows 上,kernel32.dll 库提供 CreateMutexW 函数来创建系统范围的互斥体。此函数需要互斥体有一个唯一的名称,以便跨进程识别它。

示例:

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

// mutexName starting with "Global\" will work across all user sessions
_, err := CreateMutex("SomeMutexName")
登录后复制

通过在 CreateMutex 中指定以“Global”开头的名称,可以跨多个用户会话访问互斥体。这可确保系统上仅运行应用程序的单个实例。

以上是如何使用全局互斥体确保 Go 应用程序只有一个实例在系统范围内运行?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板