同步访问同一变量

时间:2019-02-13 20:22:24

标签: go concurrency parallel-processing

我想确保针对给定值一次仅由一个线程执行我的更新功能。

func update1(int id){
   ...
   makeUpdate(id)
   ...
}

func update2(int id){
   ...
   makeUpdate(id)
   ...
}

那么,我应该如何编写makeUpdate()函数以使myUpdate块对于给定的id值仅执行一次?这意味着,如果update1正在更新ID为“ 15”的记录而update2具有ID为“ 20”的记录,则不应同步块访问。

1 个答案:

答案 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中尝试一下。