如何锁定功能

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 正在执行以下步骤:

  1. 重置互斥体。 mutex = sync.Mutex{}
  2. 锁定互斥锁。 mutex.Lock()
  3. 做事...some logic....
  4. 解除锁定。 defer mutex.Unlock()

一切都很好。

但现在假设您同时有两个 groutine,AB 运行:

  1. A 重置互斥量:mutex = sync.Mutex{}
  2. A 锁定互斥量:mutex.Lock()
  3. A 做事
  4. B 重置互斥量:mutex = sync.Mutex{} 注意: 现在所有 goroutine 的互斥量都已解锁,因为它是全局的变量!!
  5. A 解锁互斥锁,然后崩溃,因为它已经解锁了