【问题标题】:Would you ever have to lock const with a mutex lock?您是否必须使用互斥锁来锁定 const ?
【发布时间】:2018-05-30 11:40:13
【问题描述】:

我在 go 中编程并使用互斥锁来锁定某些变量,因此它们在被读取时不会被覆盖。

这让我开始思考。因为您可以多次读取一个变量。是否存在必须锁定常量变量的情况?

【问题讨论】:

  • 你能改变一个常数吗?不,如果不能,会不会有同时写入和读取的情况?
  • @icza 这就是我想知道的原因。是否有某种方式可以将其与常数一起使用。感谢您这么快的反应和阅读!
  • “常量变量”用词自相矛盾。

标签: go concurrency locking constants mutex


【解决方案1】:

规则很简单:如果多个goroutine同时访问一个variable,并且至少有一个访问是写,那么就需要同步。

如果说constants,那么就没有变量,不能取常量的地址(详见Find address of constant in go),所以不能修改常量值。

您不需要任何同步来访问来自多个 goroutine 的常量。

【讨论】:

    【解决方案2】:

    如果您谈论常量,则无需使用同步例程来访问它们(正如@icza 建议的那样)。

    但是如果你认为 const 是一个变量,一旦被赋值就不能改变它的值,那么你应该小心,因为 golang 内存模型和happens before 关系。

    【讨论】:

    • 这没有任何意义。常量是常量,不是变量,它的值是在编译时定义的,而不是在运行时定义的。 “如果您将 const 视为变量”,那么您不知道常量是什么。
    • OPs 的“常量变量”术语引起了一点误解。这就是为什么我添加了这个“如果你考虑......”部分。这意味着,如果您将变量用作常量,那么您可能会遇到一些陷阱。
    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 2021-10-21
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多