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
}
Run Code Online (Sandbox Code Playgroud)
我有一个在我的应用程序中被多次调用的 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
}
Run Code Online (Sandbox Code Playgroud)
相反,只需不要重置变量:
func handle() bool {
mutex.Lock()
defer mutex.Unlock()
....some logic.... do login...
return true
}
Run Code Online (Sandbox Code Playgroud)
为了可视化问题,假设您有一个 goroutine 执行以下步骤:
mutex = sync.Mutex{}mutex.Lock()...some logic....defer mutex.Unlock()一切都很好。
但是现在假设您有两个 groutine,A和B同时运行:
mutex = sync.Mutex{}mutex.Lock()mutex = sync.Mutex{} 注意:现在所有 goroutine 的互斥锁都被解锁了,因为它是一个全局变量!!| 归档时间: |
|
| 查看次数: |
1450 次 |
| 最近记录: |