我声明了以下类型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()
婷婷同学_
TA贡献1844条经验 获得超8个赞
是的,您的代码有效。
如果一个 goroutine 试图重新分配 的值,而另一个 goroutine 试图开始相同的值,你会遇到问题 - 这将是一个竞争条件。FuncXX
FuncXX
- 2 回答
- 0 关注
- 106 浏览
添加回答
举报
0/150
提交
取消