【问题标题】:Golang Mutex to Lock Specific Variable/MapGolang Mutex 锁定特定变量/映射
【发布时间】:2017-01-03 12:15:58
【问题描述】:

我对互斥锁在 Golang 中的工作方式有点困惑,尽管我以前使用过它们。

这是我的问题:

  1. 互斥锁到底是做什么的? (如何)您是否只使用它来锁定特定变量?

  2. 我应该使用通道而不是互斥体吗?

  3. 互斥锁和锁存器有区别吗?

我正在使用 golang 开发一个高度并发的网站,我需要在不同的时间管理每个人的钱包,并且我正在努力避免我的程序中的任何比赛。例如,如果我的程序想要向用户添加 500 积分,它将读取用户的当前余额(来自 firebase)并添加 500,然后更新值。但是如果它出于某种原因这样做了两次,则可能是用户钱包的更改不正确。

【问题讨论】:

    标签: go concurrency mutex


    【解决方案1】:

    什么是互斥锁?

    一般来说,“互斥”构造(或互斥体)有助于并发控制。定义互斥体的语言允许程序员定义代码的关键部分,该部分只能由单个执行线程输入。 Here is a simple example of using mutexes in GoHere is a bit more detailed example of using mutexes.

    互斥体还是通道?

    在决定是在 Go 应用中使用互斥锁还是基于通道的设计时,选择并不总是非常明确。这个wiki article from the Go github repo 有以下建议:

    Channel:传递数据的所有权, 分配工作单元, 传达异步结果

    互斥体:缓存、状态

    Mutex 还是 sync.Locker?

    正如@JimB 所指出的,Go 中的sync.Mutex 类型满足sync.Locker 接口类型。注意sync.MutexLock()Unlock() 方法吗?所以去吧,sync.Mutexsync.Locker

    了解更多help with Go interfaces, check out this great blog post

    【讨论】:

    • -1 抱歉,Dan,OP 询问到底锁定了什么,但没有得到回答。有更多详细信息的链接,但链接已失效,因此答案应在答案文本中包含所有相关详细信息。
    • 询问究竟是什么被锁定 .... 嗯,我想我想我的回答是“互斥锁让程序员定义只能由以下人员输入的关键代码部分单线程执行”
    • 我认为混淆是因为在其他语言中 lock 语句将适用于对象引用。存在更多混乱,因为 Win32 中的 Mutex 是系统范围的,它是应用程序知道另一个正在运行的一种方式,所以“什么被锁定”只是一个标识符,例如您的应用名称。
    【解决方案2】:
    1. Mutex 只锁定自己。由您决定该锁在您的代码中的含义。
    2. 使用通道在 goroutine 之间进行同步和通信。使用互斥体围绕单个逻辑资源提供“互斥”。
    3. 互斥体满足sync.Locker 接口。需要sync.Locker 的东西可以交替使用sync.Mutexsync.RWMutex

    同步原语与防止重复事务的概念无关。正确使用同步只会防止程序中的数据竞争。

    【讨论】:

    • 我在 godoc 上读到 mutex 满足 sync.Locker 接口,但并没有真正理解它的含义。我正在寻找一个解释。另外,我将如何使用互斥锁仅锁定特定变量? (由您决定这意味着什么?)
    • @Acidic:"Interfaces" 是一个主要的 Go 概念,你需要理解它才能使用该语言。可能从官方文档开始,例如Effective GoTour of Go 中的相应部分。除了在代码中使用它的方式之外,互斥锁与其锁定的对象之间没有任何关系。
    【解决方案3】:

    如果状态不在内存中。你真的不需要同步锁。但是,假设所有用户的钱包都在一个 Map 中。您将需要一个,因为并发写入会导致竞争条件。

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2013-02-02
      • 2010-12-31
      • 2011-06-02
      相关资源
      最近更新 更多