为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
红颜莎娜 2022-09-12 20:45:36
我声明了以下类型type TestFn func(id int, ctx context.Context) errorvar 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
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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

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

注意:你的函数变量当然会在包初始化期间编写一次。这发生在开始之前的单个戈鲁丁中。main()


查看完整回答
反对 回复 2022-09-12
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

是的,您的代码有效。


如果一个 goroutine 试图重新分配 的值,而另一个 goroutine 试图开始相同的值,你会遇到问题 - 这将是一个竞争条件。FuncXXFuncXX


查看完整回答
反对 回复 2022-09-12
  • 2 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信