我想确保我的更新函数一次只由一个线程针对给定值执行。
func update1(int id){
...
makeUpdate(id)
...
}
func update2(int id){
...
makeUpdate(id)
...
}
那么,我应该如何编写我的 makeUpdate() 函数,使 myUpdate block 对给定的 id 值只执行一次?这意味着如果 update1 正在更新 ID 为“15”的记录,而 update2 正在更新 ID 为“20”的记录,则 block 访问不应同步。
最佳答案
正如评论所建议的那样 - 您需要保护数据访问而不是功能访问。
实现这一点的最简单方法是创建一个带锁的结构类型 - 并将关键功能更新附加为方法,例如
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 中试试这个.
关于go - 同步访问同一变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54678803/