//go:build windows // Windows 文件锁实现,使用 LockFileEx. package engine import ( "os" "syscall" "unsafe" ) var ( modkernel32 = syscall.NewLazyDLL("kernel32.dll") procLockFileEx = modkernel32.NewProc("LockFileEx") procUnlockFileEx = modkernel32.NewProc("UnlockFileEx") ) const ( lockfileExclusiveLock = 0x00000002 lockfileFailImmediately = 0x00000001 ) // tryFlock 尝试以非阻塞方式获取排他锁(Windows 版). func tryFlock(f *os.File) error { var overlapped syscall.Overlapped ret, _, err := procLockFileEx.Call( f.Fd(), uintptr(lockfileExclusiveLock|lockfileFailImmediately), 0, 1, 0, uintptr(unsafe.Pointer(&overlapped)), ) if ret == 0 { return err } return nil } // unlockFlock 释放文件锁(Windows 版). func unlockFlock(f *os.File) { var overlapped syscall.Overlapped procUnlockFileEx.Call( f.Fd(), 0, 1, 0, uintptr(unsafe.Pointer(&overlapped)), ) }