gpt4 book ai didi

go - 如何进行可重新启动的线程安全AfterFunc()调用

转载 作者:行者123 更新时间:2023-12-01 21:09:33 25 4
gpt4 key购买 nike

如何以线程安全的方式进行延迟的,可重新启动的函数调用?例如,这是一个很常见的用例,如果您想对某些更改使用react,但不超过X毫秒一次。
我能想到的代码是:

var t *time.Timer
func restartableDelayed() {
if t != nil {
t.Stop()
}
t = time.AfterFunc(time.Second, func() {
t = nil
// ...
// Do the stuff here
// ...
})
}

此处明显的问题是,除了初始分配外, t = nil分配是从另一个goroutine调用的,而初始分配会受到竞争的影响。
如何以适当的并发安全方式完成此操作?我在这里唯一能想到的就是使用一个互斥锁来同步对 t的访问,但这感觉有点麻烦。还有更简洁的选择吗?

最佳答案

我认为在这里使用互斥锁是合理的,无法想到更简单的解决方案。
您只需要添加几行就可以了:

var (
mu sync.Mutex
t *time.Timer
)

func restartableDelayed() {
mu.Lock()
defer mu.Unlock()

if t != nil {
t.Stop()
}
t = time.AfterFunc(time.Second, func() {
mu.Lock()
t = nil
mu.Unlock()

// Do the stuff here
})
}

关于go - 如何进行可重新启动的线程安全AfterFunc()调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63357021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com