戈兰 : panic after mutex locks have been held for too long

标签 go locking

我试图找出是什么导致我的程序挂起,我的大多数锁的持有时间不应超过 200 毫秒。 (实际上少得多!)

我想创建两个新函数(Lock()Unlock()),这样 Lock 将有一个计时器,如果 Lock 持有时间超过该计时器,该计时器将会出现紧急情况超过 200 毫秒。

这是我当前的尝试,但它不起作用,有什么提示吗?

type ShardKV struct {
  lockChan chan bool
}

func (kv *App) lock(reason string) {
    kv.mu.Lock()

    f := func () {
        fmt.Println("PANIC: ms passed")
        select {
        case <- kv.lockChan:
            //
        default:
            panic("PANIC: " + reason)
        }
  }
    time.AfterFunc(time.Second * 10, f)
}

func (kv *App) unlock(reason string) {
    kv.lockChan <- true
    kv.mu.Unlock()
}

最佳答案

您需要使用time.AfterFunc的返回值。这是一个工作示例:

package main

import (
    "fmt"
    "sync"
    "time"
)

type Foo struct {
    m sync.Mutex
    timer *time.Timer
}

func (f *Foo) lock() {
    f.m.Lock()
    f.timer = time.AfterFunc(3 * time.Second, func() {
        panic("Too long!")
    })
}

func (f *Foo) unlock() {
    f.timer.Stop()
    f.m.Unlock()
}

func main() {
    foo := &Foo{
        sync.Mutex{},
        &time.Timer{},
    }

    foo.lock()

    // Uncomment this to see the difference
    //time.Sleep(5 * time.Second)

    foo.unlock()
    fmt.Println("Success!")
}

Playground 链接:https://play.golang.org/p/WVPp0_Iqlb

关于戈兰 : panic after mutex locks have been held for too long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36989974/

相关文章:

asp.net - 您可以在.Net 中锁定单个应用程序变量吗?

c# - 防止并发访问被传递的对象

Java无缘无故地锁定文件

android - 禁用后如何重新启用键盘锁?

amazon-web-services - 如何在 aws-sdk-go Dynamodb QueryInput 中使用 "BETWEEN"?

xml - 如何使用 goroutines 解码 XML

go - 如何使用 Go 向 urlscanio 发出发布请求?

go - 如何从 mux in go 获取可用路由?

go - 为什么必须要有Google帐户才能捐款(golang)

c# - 多线程应用程序中的单例类,锁定建议