Memastikan hanya satu contoh executable berjalan pada satu masa adalah penting untuk menghalang berbilang kejadian program yang sama daripada menggunakan sumber sistem atau mewujudkan konflik. Artikel ini meneroka cara untuk mencapai pelaksanaan satu contoh dalam sistem Golang untuk Windows menggunakan Global Mutex.
Mutex global ialah primitif penyegerakan yang membenarkan berbilang proses atau benang untuk berkongsi akses kepada sumber yang dikongsi dengan menghalang akses serentak. Dalam kes ini, menggunakan mutex global bernama "SomeMutexName" merentas semua sesi pengguna memastikan bahawa hanya satu contoh boleh laku boleh dijalankan.
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 } }
Kod ini memulakan fungsi API Windows "CreateMutexW" daripada Pustaka "kernel32.dll" menggunakan pakej syscall. Ia kemudian memanggil fungsi ini dengan nama mutex global untuk mencipta mutex bernama. Jika fungsi kembali tanpa ralat, ia menunjukkan bahawa tiada contoh lain bagi larian boleh laku. Jika tidak, ini bermakna contoh lain sudah berjalan.
Walaupun kod yang diberikan menangani isu khusus ini untuk mesin Windows, perlu diingat bahawa teknik Global Mutex tidak mudah alih merentasi semua platform. Setiap platform mempunyai mekanisme tersendiri untuk melaksanakan penguncian contoh. Contohnya, pada sistem seperti Unix, pendekatan "fail kunci" atau fungsi "fcntl" dengan "F_SETLK" boleh digunakan untuk mencapai kefungsian yang serupa.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memastikan Hanya Satu Contoh Go Executable Berjalan pada Windows?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!