golang 中的函数变量是否并发安全?
Are function variables concurrency-safe in 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)
}
}
由于Func1
、Func2
、Func3
是全局变量并分配给函数,我可以运行在具有不同参数的多个go例程中使用相同的函数吗?
规则很简单:对于来自多个 goroutine(没有同步)的并发访问,其中至少一个访问是写入,没有任何值是安全的。
你的例子只读取函数变量,所以是安全的。如果有一个 goroutine 运行 与 Execute()
的执行并发修改函数变量,那将是不安全的。但这在您的示例中不会发生。
注意:您的函数变量当然是在包初始化期间写入一次。这发生在 main()
开始之前的单个 goroutine 中。
是的,您的代码有效。
如果一个 goroutine 试图重新分配 FuncXX
的值,而另一个 goroutine 试图启动相同的 FuncXX
- 这将是一个竞争条件。
我声明了以下类型
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例程中使用相同的函数吗?
规则很简单:对于来自多个 goroutine(没有同步)的并发访问,其中至少一个访问是写入,没有任何值是安全的。
你的例子只读取函数变量,所以是安全的。如果有一个 goroutine 运行 与 Execute()
的执行并发修改函数变量,那将是不安全的。但这在您的示例中不会发生。
注意:您的函数变量当然是在包初始化期间写入一次。这发生在 main()
开始之前的单个 goroutine 中。
是的,您的代码有效。
如果一个 goroutine 试图重新分配 FuncXX
的值,而另一个 goroutine 试图启动相同的 FuncXX
- 这将是一个竞争条件。