使用全局互斥体限制 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中文网其他相关文章!