首頁 > 後端開發 > Golang > 如何確保 Go 可執行檔只有一個執行個體在 Windows 上執行?

如何確保 Go 可執行檔只有一個執行個體在 Windows 上執行?

Barbara Streisand
發布: 2024-11-27 09:24:15
原創
412 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板