我试图找出是什么导致我的程序挂起,我的大多数锁的持有时间不应超过 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/