我想确保针对给定值一次仅由一个线程执行我的更新功能。
func update1(int id){
...
makeUpdate(id)
...
}
func update2(int id){
...
makeUpdate(id)
...
}
那么,我应该如何编写makeUpdate()函数以使myUpdate块对于给定的id值仅执行一次?这意味着,如果update1正在更新ID为“ 15”的记录而update2具有ID为“ 20”的记录,则不应同步块访问。
答案 0 :(得分:0)
正如评论所建议的那样-您需要保护数据访问而不是功能访问。
实现此目的的最简单方法是使用锁创建结构类型-并将关键的功能更新作为方法进行附加,例如
type MyData struct {
l sync.Mutex
// add any other task related attributes here too
}
// makeUpdate *MUST* use a pointer to our struct (i.e. 'm *MyData')
// as Mutex logic breaks if copied (so no 'm MyData')
func (m *MyData) makeUpdate(id int) {
m.l.Lock()
defer m.l.Unlock()
fmt.Printf("better makeUpdate(%d)\n", id)
// do critical stuff here
// don't dilly-dally - lock is still being used - so return quickly
}
在playground中尝试一下。