【问题标题】:Are function variables are concurrent safe in golang?函数变量在golang中是并发安全的吗?
【发布时间】:2021-07-15 07:41:04
【问题描述】:

我删除了以下类型

type TestFn func(id int, ctx context.Context) error

var Func1 = TestFn(func(id int, ctx context.Context) error {
  // do some work -- the execution block is concurrent safe
}

var Func2 = TestFn(func(id int, ctx context.Context) error {
  // do some work
}

var Func3 = TestFn(func(id int, ctx context.Context) error {
  // do some work
}

func Execute()
   for i := 0; i < 5; i++ {
      go Func1(i, ctx)
      go Func2(i, ctx)
      go Func3(i, ctx)
   }
}

由于 Func1、Func2、Func3 是全局变量并分配给函数,我可以在具有不同参数的多个 go 例程中运行相同的函数吗?

【问题讨论】:

    标签: function go concurrency goroutine


    【解决方案1】:

    规则很简单:对于来自多个 goroutine(无同步)的并发访问,其中至少有一个访问是写入,没有任何值是安全的。

    您的示例仅读取函数变量,因此是安全的。如果有一个 goroutine 与 Execute() 的执行同时运行会修改函数变量,那将是不安全的。但这在您的示例中不会发生。

    注意:您的函数变量当然是在包初始化期间编写一次。这发生在 main() 启动之前的单个 goroutine 中。

    【讨论】:

    • 谢谢!这澄清/清除了我的问题
    【解决方案2】:

    是的,您的代码有效。


    如果一个 goroutine 尝试重新分配 FuncXX 的值,而另一个 goroutine 尝试启动相同的 FuncXX,则会遇到问题——这将是一种竞争条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-03
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多