Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Memastikan Hanya Satu Contoh Aplikasi Go Menjalankan Seluruh Sistem Menggunakan Mutex Global?

Bagaimana untuk Memastikan Hanya Satu Contoh Aplikasi Go Menjalankan Seluruh Sistem Menggunakan Mutex Global?

Linda Hamilton
Linda Hamiltonasal
2024-11-30 05:32:25593semak imbas

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

Menghadkan kepada Satu Contoh Golang Boleh Laksanakan dengan Global Mutex

Ia adalah keperluan biasa untuk menguatkuasakan satu contoh aplikasi. Golang menyediakan penyelesaian yang mudah menggunakan pakej sync.Mutex. Walau bagaimanapun, kaedah ini hanya berfungsi dalam satu proses. Untuk mengehadkan aplikasi kepada satu contoh di seluruh sistem, memanfaatkan mutex global adalah perlu.

Pada Windows, pustaka kernel32.dll menawarkan fungsi CreateMutexW untuk mencipta mutex seluruh sistem. Fungsi ini memerlukan nama unik untuk mutex mengenal pastinya merentas proses.

Contoh:

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")

Dengan menyatakan nama yang bermula dengan "Global" dalam CreateMutex, mutex boleh diakses merentasi berbilang sesi pengguna. Ini memastikan bahawa hanya satu contoh aplikasi yang dijalankan pada sistem.

Atas ialah kandungan terperinci Bagaimana untuk Memastikan Hanya Satu Contoh Aplikasi Go Menjalankan Seluruh Sistem Menggunakan Mutex Global?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn