동일한 프로그램의 여러 인스턴스를 방지하려면 한 번에 실행 파일의 단일 인스턴스만 실행되도록 하는 것이 중요합니다. 시스템 리소스를 소비하거나 충돌을 일으키지 않습니다. 이 기사에서는 글로벌 뮤텍스를 사용하여 Windows 시스템용 Golang에서 단일 인스턴스 실행을 달성하는 방법을 살펴봅니다.
글로벌 뮤텍스는 여러 프로세스를 허용하는 동기화 프리미티브입니다. 또는 동시 액세스를 방지하여 공유 리소스에 대한 액세스를 공유하는 스레드입니다. 이 경우 모든 사용자 세션에서 "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 시스템의 이 특정 문제를 해결하지만 Global Mutex 기술은 이식성이 없다는 점에 주목할 가치가 있습니다. 모든 플랫폼에서. 각 플랫폼에는 인스턴스 잠금을 구현하기 위한 자체 메커니즘이 있습니다. 예를 들어 Unix 계열 시스템에서는 "lockfile" 접근 방식이나 "F_SETLK"가 포함된 "fcntl" 기능을 사용하여 유사한 기능을 구현할 수 있습니다.
위 내용은 Windows에서 Go 실행 파일의 인스턴스가 하나만 실행되도록 하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!