go - 同步访问同一变量

标签 go concurrency parallel-processing

我想确保我的更新函数一次只由一个线程针对给定值执行。

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/

相关文章:

go - 直接从命令行运行但在 VS Code 上导致 "Not able to determine import path"的简单 Go 代码

go - 使用 POSTMAN 访问 FormValue Golang 中的 POST 请求值

android - 如何在 Crashlytics 中获取 golang 的 Stack-trace

performance - 缓存高流量站点时处理并发问题

go - 找不到 Go 包

java - 匿名线程类无法访问非静态实例变量

java - RxJava 中的单线程 ExecutorService 相当于什么?

java - 使用 java ParallelScatterZipCreator 快速压缩文件夹

c++ - 如何并行化一个循环?

c++ - 在 C++ OpenMP 代码中测量执行时间