猿问

函数变量在 golang 中并发安全吗?

我声明了以下类型


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)

   }

}

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


红颜莎娜
浏览 107回答 2
2回答

阿波罗的战车

规则很简单:对于来自多个 goroutine(无同步)的并发访问,其中至少有一个访问是写入,则没有一个值是安全的。您的示例仅读取函数变量,因此它是安全的。如果有一个戈鲁廷在执行的同时运行,那将修改函数变量,那将是不安全的。但这在你的例子中不会发生。Execute()注意:你的函数变量当然会在包初始化期间编写一次。这发生在开始之前的单个戈鲁丁中。main()

婷婷同学_

是的,您的代码有效。如果一个 goroutine 试图重新分配 的值,而另一个 goroutine 试图开始相同的值,你会遇到问题 - 这将是一个竞争条件。FuncXXFuncXX
随时随地看视频慕课网APP

相关分类

Go
我要回答