如何锁定功能
How to lock function
var mutex sync.Mutex
func main() {
handle()
go register()
}
func register(){
myObject.OnEvent().DoFunc(HandleConnect)
}
func HandleConnect(){
handle()
}
func handle() bool {
mutex = sync.Mutex{}
mutex.Lock()
defer mutex.Unlock()
....some logic.... do login...
return true
}
我有一个在我的应用程序中多次调用的 HandleConnect
我想锁定句柄,因为如果有很多调用我希望只有一个会执行登录逻辑
当我 运行 它时,我得到了一个错误
致命错误:同步:解锁已解锁的互斥锁
我该如何解决?
您的代码中存在竞争条件。您正在使用一个全局变量(就目前而言,这很好),但是您不断地重置互斥变量:
func handle() bool {
mutex = sync.Mutex{} // Here you are re-initializing the mutex every time
mutex.Lock()
defer mutex.Unlock()
....some logic.... do login...
return true
}
相反,只需不要重置变量:
func handle() bool {
mutex.Lock()
defer mutex.Unlock()
....some logic.... do login...
return true
}
为了使问题形象化,假设您有一个 goroutine 正在执行以下步骤:
- 重置互斥体。
mutex = sync.Mutex{}
- 锁定互斥锁。
mutex.Lock()
- 做事
...some logic....
- 解除锁定。
defer mutex.Unlock()
一切都很好。
但现在假设您同时有两个 groutine,A 和 B 运行:
- A 重置互斥量:
mutex = sync.Mutex{}
- A 锁定互斥量:
mutex.Lock()
- A 做事
- B 重置互斥量:
mutex = sync.Mutex{}
注意: 现在所有 goroutine 的互斥量都已解锁,因为它是全局的变量!!
- A 解锁互斥锁,然后崩溃,因为它已经解锁了
var mutex sync.Mutex
func main() {
handle()
go register()
}
func register(){
myObject.OnEvent().DoFunc(HandleConnect)
}
func HandleConnect(){
handle()
}
func handle() bool {
mutex = sync.Mutex{}
mutex.Lock()
defer mutex.Unlock()
....some logic.... do login...
return true
}
我有一个在我的应用程序中多次调用的 HandleConnect 我想锁定句柄,因为如果有很多调用我希望只有一个会执行登录逻辑 当我 运行 它时,我得到了一个错误 致命错误:同步:解锁已解锁的互斥锁
我该如何解决?
您的代码中存在竞争条件。您正在使用一个全局变量(就目前而言,这很好),但是您不断地重置互斥变量:
func handle() bool {
mutex = sync.Mutex{} // Here you are re-initializing the mutex every time
mutex.Lock()
defer mutex.Unlock()
....some logic.... do login...
return true
}
相反,只需不要重置变量:
func handle() bool {
mutex.Lock()
defer mutex.Unlock()
....some logic.... do login...
return true
}
为了使问题形象化,假设您有一个 goroutine 正在执行以下步骤:
- 重置互斥体。
mutex = sync.Mutex{}
- 锁定互斥锁。
mutex.Lock()
- 做事
...some logic....
- 解除锁定。
defer mutex.Unlock()
一切都很好。
但现在假设您同时有两个 groutine,A 和 B 运行:
- A 重置互斥量:
mutex = sync.Mutex{}
- A 锁定互斥量:
mutex.Lock()
- A 做事
- B 重置互斥量:
mutex = sync.Mutex{}
注意: 现在所有 goroutine 的互斥量都已解锁,因为它是全局的变量!! - A 解锁互斥锁,然后崩溃,因为它已经解锁了